有没有办法让 autofac 解析具有具体实现的服务,构造函数最具体地匹配给定参数。
我的意思是匹配子类型的构造函数,而不是匹配基类型的构造函数。
例如我想让下面的测试通过
[TestFixture]
public class AutofacResolvTestFixture
{
[Test]
public void test()
{
var cb = new ContainerBuilder();
cb.RegisterType<Child1>();
cb.RegisterType<Child2>();
cb.RegisterType<ServiceImpl1>().As<IService>();
cb.RegisterType<ServiceImpl2>().As<IService>();
var container = cb.Build();
var c1=container.Resolve<Child1>();
var c2=container.Resolve<Child2>();
var s1 = container.Resolve<IService>(new TypedParameter(c1.GetType(), c1));
var s2 = container.Resolve<IService>(new TypedParameter(c2.GetType(), c2));
Assert.That(s1, Is.InstanceOf<ServiceImpl1>());
Assert.That(s2, Is.InstanceOf<ServiceImpl2>());
Assert.That(s1.ConstructorParam, Is.SameAs(c1));
Assert.That(s2.ConstructorParam, Is.SameAs(c2));
}
}
public class baseClass {}
public class Child1 : baseClass{}
public class Child2 : baseClass{}
public interface IService
{
baseClass ConstructorParam { get; }
}
public class ServiceImpl1 : IService
{
private baseClass _b;
public ServiceImpl1(baseClass b)
{
_b = b;
}
public baseClass ConstructorParam
{
get
{
return _b;
}
}
}
public class ServiceImpl2 : IService
{
private baseClass _b;
public ServiceImpl2(Child2 b)
{
_b = b;
}
public baseClass ConstructorParam
{
get
{
return _b;
}
}
}
我的目标是创建 IService、IEditor 并能够通过将 IEditor 传递给 autofac 来解析类型的 IEditor。我想这样做,以便我可以通过简单地继承 IEditor 并使用 IEditor 适用的适当构造函数类型来“覆盖”类型的编辑器。
谢谢。
最佳答案
看看我对 this question 的解决方案.也许您可以使用相同的解决方案,使用 Func<Type, IService>
代替工厂委托(delegate),并将 ServiceImplX 键控 到相应的子类型,而不是使用命名注册。
关于c# - Autofac基于TypedParameter的不同服务解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3423181/