Имеет ли IoC по умолчанию ServiceStack что-то похожее на метод.ToFactory() от ninject?
Используя ninject, я могу создать абстрактную фабрику, используя следующий синтаксис из корня композиции приложения:
kernel.Bind<IBarFactory>().ToFactory();
Имеет ли контейнер IoC по умолчанию ServiceStack аналогичную функциональность? Я хотел бы реализовать абстрактную фабрику в одном из моих классов обслуживания, чтобы создавать репозитории по мере необходимости.
Одно предложение, которое я слышал, было использовать:
HostContext.Container.Resolve<[InsertDependancyHere]>()
но я бы хотел избежать создания доступа к контейнеру вне корневого каталога композиции (файл Apphost.cs).
1 ответ
Насколько я могу судить, реализация Funq IoC в ServiceStack не включает в себя эту реализацию Abstract Factory, такую как поддержка Abstract Factory в Ninject (или средство Typed Factory Facility Касла Виндзора, которое я использовал).
Вы по-прежнему можете избежать анти-паттерна Service Locator, создав конкретную реализацию Factory и внедрив ее в свои классы.
public class BarFactory : IBarFactory
{
// constructor inject dependencies to the factory - no service locator
public BarFactory() { ... }
// create objects from factory
public IBar GetBar() { ... }
}
Другие ваши классы могут внедрять IBarFactory и вызывать его напрямую.
По своей конструкции Func не имеет ничего общего с другими функциями. В ServiceStack добавлены некоторые функции, но в основном это связано с автоматической регистрацией проводки.
Если вы не можете создать конкретную реализацию для своих фабрик, этот другой ответ SO может показать вам, как это сделать самостоятельно.