Хорошо, так недавно я читал в ninject, но у меня возникли проблемы с пониманием того, что делает его лучше, почему они ссылаются на DI-страницу «бедного человека» на странице вики. Печально то, я пошел на все свои страницы на вики и до сих пор не понимаю = (Проблемы с пониманием ninject (или только контейнера IOC в целом) по заводской DI?
Обычно я обернуть мои классы обслуживания в схеме фабрики, которая обрабатывает DI следующим образом:.
public static class SomeTypeServiceFactory
{
public static SomeTypeService GetService()
{
SomeTypeRepository someTypeRepository = new SomeTypeRepository();
return = new SomeTypeService(someTypeRepository);
}
}
что мне кажется, много, как модули:
public class WarriorModule : NinjectModule {
public override void Load() {
Bind<IWeapon>().To<Sword>();
Bind<Samurai>().ToSelf().InSingletonScope();
}
}
Где каждый класс будет иметь это связано модуль и вы Свяжите это конструктор для конкретной реализации Хотя Ninject код-меньше линии Я просто не вижу. преимущество, когда вы добавляете/удаляете конструкторы или изменяете реализация конструктора интерфейса, вам придется изменить модуль практически так же, как на фабрике нет? Поэтому мы не видим преимущества здесь.
Тогда я думал, что я мог придумать общую конвенцию фабрика, основанной, как так:
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;
}
Однако это дерьмовое по 2 причинам: 1) Его сильно зависит от именования, 2) Это предполагается в репозитории никогда не будет никаких конструкторов (не верно), и единственным конструктором службы будет соответствующий репо (также не верно). Мне сказали «Эй, вот где вы должны использовать контейнер IoC, здесь было бы здорово!» И, таким образом, мое исследование началось ... но я просто не вижу его, и я не понимаю его ...
Есть ли какой-то способ, который ninject может автоматически разрешать конструкторы класса без специального объявления, отлично подходит для использования на моем общем заводе (я также понимаю, что могу просто сделать это вручную, используя отражение, но это удар производительности, а ninject говорит прямо на своей странице, что они не используют отражение).
Просвещение по этой проблеме и/или показ того, как ее можно использовать на моей фабрике, было бы высоко оценено!
EDIT: Ответ
Так благодаря объяснению ниже я умело, чтобы полностью понять удивительность Ninject и мой общий завод выглядит следующим образом:
public static class EntityServiceFactory
{
public static TServiceClass GetService<TServiceClass>()
where TServiceClass : class
{
IKernel kernel = new StandardKernel();
return kernel.Get<TServiceClass>();
}
}
Довольно удивительным. Все обрабатывается автоматически, так как конкретные классы имеют неявное связывание.
Обычная сломанный запись комментарий: бежать [Инъекции зависимостей в .NET книге мой Mark Seemann] (http.commanning.com/seemann). Я не могу себе представить, что вы не чувствуете уверенности в том, почему и как DI (шаблон) и контейнеры DI в течение недели владеть книгой. –