2010-08-06 67 views
2

有没有办法让autofac解决具体实现的服务,该服务具有与特定参数最具体匹配的构造函数。基于TypedParameter的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并能够通过将其传递给autofac来解决IEditor有型。我想这样做,以便我可以通过简单地继承IEditor并使用IEditor适用的适当构造函数类型来“覆盖”某个类型的编辑器。

谢谢。

回答

0

看看我的解决方案this question。也许您可以使用相同的解决方案,使用Func<Type, IService>工厂代理,并将ServiceImplX 键入而不是使用命名注册。

相关问题