Я прочитал кучу вопросов и всех документов в вики Ninject, но я все еще сомневаюсь и задаю себе вопросы: «Я делаю это правильно?»Правильный способ использования инъекции зависимостей, когда некоторые аргументы будут известны только во время выполнения
- Что делать, если мне нужно использовать контроллер для инициализации объекта? И Поле аргумент будет известен только по адресу runtime?
A) Так что мне нужно что-то вроде этого:
public class MyClass : IMyInterface
{
private string _field;
readonly IRepository _repo;
public MyClass(string field, IRepository repo)
{
_field = field;
_repo = repo;
}
}
Но как связать это правильно? Или я должен навсегда забыть об использовании конструктора по какой-либо причине, кроме интродукции зависимостей конструктора?
B) и сделать это нравится:
public class MyClass : IMyInterface
{
private string _field;
readonly IRepository _repo;
public MyClass(IRepository repo)
{
_repo = repo;
}
public void Initialize(string field)
{
_field = field;
}
}
Я думаю, что это не нормально, чтобы позвонить в любое время, когда мне нужно приемлю эту функцию Initialize, или я ошибаюсь?
В соответствии с этим ответы Can't combine Factory/DI и Dependency Inject (DI) "friendly" library и Is there a pattern for initializing objects created via a DI container
Использование Abstract Factory, если вам нужно недолгим объект
зависимостями инъецированные Конструктора инъекций, как правило, долговечны, но иногда вам нужно короткоживущий объект, или построить зависимость, основанную на значении, известном только во время выполнения.
C) я должен делать это нравится:
public interface IMyInterface { }
public interface IMyFactory
{
MyClass Create(string field);
}
public class MyFactory : IMyFactory
{
private readonly IRepository _repo;
public MyFactory (IRepository repo)
{
_repo = repo;
}
public MyClass Create(string field)
{
return new MyClass(_repo, field);
}
}
public class MyClass : IMyInterface
{
private string _field;
readonly IRepository _repo;
public MyClass(IRepository repo, string field)
{
_repo = repo;
_field = field;
}
}
И если мне нужно MyClass из другого класса я собираюсь использовать его как
public class OtherClass
{
private IMyInterface _myClass;
public OtherClass(IMyFactory factory)
{
_myClass = factory.Create("Something");
}
}
Не слишком громоздким ?
И мой вопрос: что мне нужно использовать в случае A, B или C? И почему? Или может быть что-то еще?
Пожалуйста, отредактируйте свой вопрос на несколько сфокусированных, потому что он в настоящее время слишком широк, и он, вероятно, будет закрыт в текущей форме, хотя он хороший ... – kayess
@kayess done. Я отрезал половину вопроса. Спасибо за совет – PilgrimViis
@PilgrimViis по-прежнему не подходит для SO, к сожалению, может быть, идея прочитать FAQ и, возможно, опубликовать их на одном из других сайтов. – ChrisBint