В моем приложении, у меня есть сервис, который требует параметр конструктора не разрешен путем Autofac, что я создаю экземпляр с помощью делегата завода:Как объединить тип отношений с контролируемым временем жизни (т. Е. Принадлежит <T>) с фабрикой делегатов?
public class Service
{
public Service(string parameter /*, ... other dependencies */)
{
}
public delegate Service Factory(string parameter);
}
Это прекрасно работает! Мне очень нравится эта функция.
Я также хотел Controlled отношения Lifetime, так что я могу позволить мой компонент зависит от Func<Owned<ISomething>>
, как это:
public class Component
{
private Func<Owned<ISomething>> _somethingFactory;
/* constructor omitted for brevity */
public void DoSomethingUseful()
{
using (var ownedSomething = _somethingFactory())
{
/* Lots of useful code here */
}
}
}
Моя проблема заключается в том, что теперь я хочу, чтобы объединить два. Я не могу иметь экземпляр Func<Owned<Service>>
инъекции, так как он нуждается в том, что параметр, поэтому мое текущее решение является абстрактной фабрики далеко в другую службу, скажем IServiceFactory
:
public interface IServiceFactory
{
Service Create(string parameter);
}
... реализован как таковой:
public class ServiceFactory : IServiceFactory
{
private Service.Factory _internalFactory;
public ServiceFactory(Service.Factory internalFactory)
{
_internalFactory = internalFactory;
}
public Service Create(string parameter)
{
return _internalFactory(parameter);
}
}
Мой компонент становится это:
public class Component
{
Func<Owned<IServiceFactory>> _serviceFactoryFactory;
/* ... */
}
необходимость такого имени поля оставляет неприятный привкус во рту до того, что я suspec t должен быть более чистый способ справиться с этим делом.
Есть ли другой способ?
На самом деле, мне не нужен 'IServiceFactory', поскольку я могу зависеть от' Func> ', но все же это фабрика фабрик. –