Okay, tak niedawno czytałem w ninject, ale mam problem ze zrozumieniem, co sprawia, że jest to lepsze od tego, dlaczego polecono je jako "DI" biednego człowieka na stronie wiki. Smutne jest to, podszedłem wszystkich swoich stron na wiki i nadal nie rozumiem = (Masz problemy ze zrozumieniem ninject (lub po prostu pojemnik IOC w ogóle) nad fabryczną DI?
Zazwyczaj będę owijać moich klas usług we wzór fabryki, który obsługuje DI tak:.
public static class SomeTypeServiceFactory
{
public static SomeTypeService GetService()
{
SomeTypeRepository someTypeRepository = new SomeTypeRepository();
return = new SomeTypeService(someTypeRepository);
}
}
które mi wydaje się trochę jak moduły:
public class WarriorModule : NinjectModule {
public override void Load() {
Bind<IWeapon>().To<Sword>();
Bind<Samurai>().ToSelf().InSingletonScope();
}
}
gdzie każda klasa będzie mieć to moduł związany i Bind to konstruktora do konkretnej realizacji Chociaż kod ninject jest 1 mniej linia ja po prostu nie widzi. przewagę, za każdym razem, gdy dodajesz/usuwasz konstruktorów lub zmieniasz implementacja konstruktora interfejsu, musielibyście zmienić moduł w taki sam sposób, jak w fabryce? Więc nie widzę tutaj przewagi.
Wtedy pomyślałem mogłem wymyślić generycznego konferencyjnym fabryce w oparciu tak:
public static TServiceClass GetService<TServiceClass>()
where TServiceClass : class
{
TServiceClass serviceClass = null;
string repositoryName = typeof(TServiceClass).ToString().Replace("Service", "Repository");
Type repositoryType = Type.GetType(repositoryName);
if (repositoryType != null)
{
object repository = Activator.CreateInstance(repositoryType);
serviceClass = (TServiceClass)Activator.CreateInstance(typeof (TServiceClass), new[]{repository});
}
return serviceClass;
}
jednak jest to bzdura dla 2 powodów: 1) Jest ściśle zależne od konwencji nazewnictwa, 2) założonej repozytorium nigdy nie będzie miało żadnych konstruktorów (nie będzie to prawda), a jedynym konstruktorem usługi będzie odpowiadające repo (również nie prawdziwe). Powiedziano mi, "hej, to jest miejsce, w którym powinieneś użyć kontenera IoC, byłoby świetnie tutaj!" I tak moje badania zaczęły się ... ale ja po prostu nie widzę tego i mam problem ze zrozumieniem ...
Czy istnieje sposób, w jaki program Ninject może automatycznie rozwiązać konstruktorów klasy bez określonej deklaracji, tak aby był Świetne do wykorzystania w mojej generycznej fabryce (zdaję sobie również sprawę, że mogłem to zrobić ręcznie za pomocą refleksji, ale to jest hit wydajnościowy, a ninject mówi, że na ich stronie nie używają refleksji).
Oświecenie w tej kwestii i/lub pokazanie, jak można go wykorzystać w mojej fabryce generycznej, byłoby bardzo docenione!
EDIT: Odpowiedź
So dzięki wyjaśnienie poniżej byłem sprawnie, aby w pełni zrozumieć awesomeness ninject i mój rodzajowa fabryka wygląda następująco:
public static class EntityServiceFactory
{
public static TServiceClass GetService<TServiceClass>()
where TServiceClass : class
{
IKernel kernel = new StandardKernel();
return kernel.Get<TServiceClass>();
}
}
dość niesamowite. Wszystko jest obsługiwane automatycznie, ponieważ konkretne klasy mają domyślne powiązanie.
Zwykły zapisany komentarz dotyczący rekordu: przejdź do [Injection Injection in .NET book my Mark Seemann] (http.commanning.com/seemann). Nie mogę sobie wyobrazić, że nie masz pewności, dlaczego i jak DI (wzór) i kontenery DI w ciągu tygodnia od posiadania książki. –