2016-10-11 5 views
3

В моем приложении, у меня есть сервис, который требует параметр конструктора не разрешен путем 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 должен быть более чистый способ справиться с этим делом.

Есть ли другой способ?

+0

На самом деле, мне не нужен 'IServiceFactory', поскольку я могу зависеть от' Func > ', но все же это фабрика фабрик. –

ответ

2

Вы можете изменить свой впрыскивается завод, чтобы включить параметр строки:

private Func<string, Owned<ISomething>> _somethingFactory; 

Затем вы можете передать string на завод, когда вы хотите создать новый экземпляр:

public void DoSomethingUseful() 
{ 
    using (var ownedSomething = _somethingFactory("my parameter")) 
    { 
     /* Lots of useful code here */ 
    } 
} 

Я ve создал .NET Fiddle с небольшим рабочим образцом.

+0

Ow nice :) не знал, что смогу это сделать. –

+0

Это работает только в том случае, если в моем случае есть только один параметр этого типа, например 'string', верно? Я читаю о параметризированном экземпляре: http://docs.autofac.org/en/latest/resolve/relationships.html#parameterized-instantiation-func-x-y-b –

+0

Да, к сожалению, это так. Однако, чтобы передать более одной строки, вы можете, например, просто использовать массив 'string' в качестве параметра, но это явно не так хорошо, как наличие отдельных параметров. – fknx

 Смежные вопросы

  • Нет связанных вопросов^_^