【发布时间】:2018-09-10 17:18:38
【问题描述】:
我似乎无法在 Autofac 中解决这种情况:
- 我的业务逻辑需要一个 Ifinal 类型的对象。
- 实现类 Final 有几个业务逻辑不知道的依赖关系,但可以通过 IoCContainer 直接解决。
- Final 还有其他依赖项,只有在运行时业务逻辑才知道。
- 我希望能够在 IFinal 上使用拦截器,因此应该通过 IFinal 注册和解析 Final 类。
所以我尝试为 IFinal 创建一个工厂,但我似乎无法正确解决问题。
示例代码:
public static void Main(string[] args)
{
ContainerBuilder builder = new ContainerBuilder();
builder.RegisterType<Dependency>().As<IDependency>();
builder.RegisterType<Final>().As<IFinal>();
// this fails because context c is not available at the time finalObjectFactoryMethod is used
builder.Register<Factory>((c,p)=>{
var dependency = c.Resolve<IDependency>();
Func<int, IFinal> finalObjectFactoryMethod =
rta => c.Resolve<IFinal>(
new TypedParameter(typeof(IDependency), dependency),
new TypedParameter(typeof(int), rta)
);
return new Factory(finalObjectFactoryMethod);
}).As<IFactory>();
// this works but doesn't use the resolve mechanism for IFinal
/*
builder.Register<Factory>((c,p)=>{
var dependency = c.Resolve<IDependency>();
Func<int, IFinal> finalObjectFactoryMethod = rta => new Final(dependency, rta);
return new Factory(finalObjectFactoryMethod);
}).As<IFactory>();
*/
IContainer container = builder.Build();
IFactory factory = container.Resolve<IFactory>();
IFinal final = factory.GetFinalObject(42);
}
}
public interface IDependency{}
public class Dependency: IDependency{}
public interface IFinal
{
void Test();
}
public class Final: IFinal
{
public Final(IDependency dependency, int runtimeArgument){}
public void Test(){}
}
public interface IFactory
{
IFinal GetFinalObject(int runtimeArgument);
}
public class Factory: IFactory
{
readonly Func<int, IFinal> _finalObjectFactoryMethod;
public Factory(Func<int, IFinal> finalObjectFactoryMethod)
{
_finalObjectFactoryMethod = finalObjectFactoryMethod;
}
public IFinal GetFinalObject(int runtimeArgument)
{
return _finalObjectFactoryMethod(runtimeArgument);
}
}
Google 和 Autofac 文档在这方面无法帮助我。
不知何故,我的大脑似乎有一个结,也许我只是尝试使用错误的模式。
我很确定有一个解决方案,但我就是找不到。
【问题讨论】:
标签: c# autofac ioc-container interceptor factory-method