c# - Autofac基于TypedParameter的不同服务解析

标签 c# dependency-injection inversion-of-control autofac

有没有办法让 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/

相关文章:

实现特定接口(interface)的 "Type"的C#列表

c# - ASP.NET MVC3 : Set custom IServiceProvider in ValidationContext so validators can resolve services

spring - Spring 框架是否可以以注释驱动的方式注入(inject)集合?

c# - 如何确定一个数组是另一个数组的一部分?

c# - 整数上的 Mongo C# 过滤器包含

c# - 将从文本文件解析的 250 万行数据插入 Sql 服务器的最快方法是什么

asp.net-mvc-3 - 工作单元和存储库模式是一起使用还是两个解决方案?

php - 如何处理不是 "real"依赖项的依赖项?

spring - 如何使用 Spring resource.groovy 正确注入(inject) Grails 服务

c# - 从静态方法中使用 IoC 容器解析类型