Я ищу предложения относительно лучшего способа проектирования объектов для 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, поскольку строковый объект, такой как name, нелегко зарегистрировать, и использование становится осложняется с контейнером 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.
Мысли?