Я ищу предложения относительно лучшего способа проектирования объектов для IoC
Предположим, у меня есть объект (Сервис), имеющий зависимость от DataContext, который зарегистрирован в Ioc.
Но для этого также требуется свойство name, я мог бы спроектировать объект так:
class Service
{
public Service(IDataContext dataContext,
string name)
{
this._dataContext = dataContext;
this._name = name
}
public string Name
{
get
{
return _name;
}
}
}
Проблема в том, что использование с контейнерами Ioc становится очень сложным, поскольку строковый объект, такой как имя, нелегко зарегистрировать, а использование становится сложнее с контейнером Ioc:
Таким образом, разрешение становится запутанным:
var service = Ioc.Resolve<Service>( ?? )
Другой подход заключается в следующем:
class Service
{
public Service(IDataContext dataContext)
{
this._dataContext = dataContext;
}
public string Name { get; set; }
}
Разрешение теперь стало проще:
var service = Ioc.Resolve<Service>();
service.Name = "Some name";
Единственный недостаток - указание имени больше не требуется.
Я хотел бы услышать от экспертов DI или IoC, как они пойдут на разработку этого и при этом будут оставаться совершенно независимыми от технологии контейнеров для конкретного Ioc.
Я знаю, что многое зависит от того, как вы хотите использовать это, вариант 2 был бы идеальным, если бы имя действительно было необязательным. Но в случае, когда требуется имя, вы можете добавить шаг проверки в другой точке кода, а вместо этого перейти к дизайну, чтобы упростить Ioc.
Мысли