在我的应用程序中,我有一个服务,需要一个未由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;
/* ... */
}
对这样一个字段名称的需求在我的口中留下了不好的味道,以至于我怀疑必须有更清洁的方法来处理这种情况。
还有其他办法吗?
答案 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。