如何将受控生命周期关系类型(即Owned <t>)与委托工厂相结合?

时间:2016-10-11 13:27:35

标签: autofac

在我的应用程序中,我有一个服务,需要一个未由Autofac解析的构造函数参数,我使用委托工厂进行实例化:

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;

    /* ... */ 
}

对这样一个字段名称的需求在我的口中留下了不好的味道,以至于我怀疑必须有更清洁的方法来处理这种情况。

还有其他办法吗?

1 个答案:

答案 0 :(得分:2)

您可以更改注入的工厂以包含字符串参数:

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

然后,当您要创建新实例时,可以将string传递给工厂:

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

我创建了一个带有小样本的.NET Fiddle