C# 希望Autofac不注册任何具有多个实现的接口

C# 希望Autofac不注册任何具有多个实现的接口,c#,.net,dependency-injection,autofac,C#,.net,Dependency Injection,Autofac,我目前正在为我们公司测试Autofac 我们希望有以下规则: 如果某个接口只实现过一次,则使用builder.RegisterAssemblyTypes自动添加它(请参见下文) 否则,我们需要确保手动编写规则,以确定哪个实现是“默认”实现 我有以下代码: var builder = new ContainerBuilder(); builder.RegisterAssemblyTypes(Assembly .Load("Lunch.Service")).As(t => t.GetI

我目前正在为我们公司测试Autofac

我们希望有以下规则:

  • 如果某个接口只实现过一次,则使用builder.RegisterAssemblyTypes自动添加它(请参见下文)

  • 否则,我们需要确保手动编写规则,以确定哪个实现是“默认”实现

  • 我有以下代码:

    var builder = new ContainerBuilder();
    builder.RegisterAssemblyTypes(Assembly
        .Load("Lunch.Service")).As(t => t.GetInterfaces()[0]);
    builder.RegisterType<ConsoleLoggerService>()
        .As<ILoggerService>().SingleInstance();
    builder.RegisterModule(new DestinationModule());
    builder.RegisterType<TransportationService>()
        .As<ITransportationService>().PropertiesAutowired();
    
    var builder=newcontainerbuilder();
    builder.RegisterAssemblyTypes(程序集
    .Load(“午餐服务”)).As(t=>t.GetInterfaces()[0]);
    builder.RegisterType()
    .As().SingleInstance();
    RegisterModule(newdestinationmodule());
    builder.RegisterType()
    .As().PropertiesAutowired();
    

    现在,它正在工作,但它决定了第一个实现是什么,并将自动创建它。我们希望将其设置为手动过程,如果不手动创建“规则”,则会引发错误。这可能吗?

    您可以这样做:

    cb.RegisterAssemblyTypes(assembly).Where(type =>
    {
        var implementations = type.GetInterfaces();
    
        if (implementations.Length > 0)
        {
            var iface = implementations[0];
    
            var implementers =
                from t in assembly.GetTypes()
                where t.GetInterfaces().Contains(iface)
                select t;
    
            return implementers.Count() == 1;
        }
    
        return false;
    })
    .As(t => t.GetInterfaces()[0]);
    

    这将注册仅存在一个实现者的所有实现,并忽略具有多个实现的接口,以便您可以手动注册它们。请注意,我并不声称这在任何方面都是有效的(取决于服务的数量,您可能希望查看缓存实现者等)。

    “请注意,我并不声称这在任何方面都是有效的”。我几乎从未遇到过注册阶段的性能问题,在程序集中迭代所有类型通常都相当快。您展示的这段代码不会对运行时性能(解析实例所需的时间)产生负面影响,因此这不会有任何问题。谢谢。我来看看。想知道用例是否有意义。基本上,我们有这么多引用的问题,有时我们不知道为什么会发生这样的事情,这是因为注入了错误的类。因此,这将使所有具有一个的实现都成为默认,如果有多个实现,那么我们需要手动创建案例。您是否有正当理由要找到多个实现者,或者您找到多个实现者更像是一种错误情况?如果这确实是一个错误,或者至少是一个意外情况,那么当发现多个实现时,您可能真的应该抛出一个异常或记录一个错误(因为这可能意味着您得到了一个不应该部署的程序集的引用)?或者您真的有多个可用的实现,并且需要根据配置手动选择一个?如果是后者,这似乎是一个合理的用例。我有多个可用的实现,需要根据配置选择一个。又称作我们有一个网络服务和网站。网站需要一个实现,web服务需要另一个实现。但如果我忘了放一个特殊的例子,那么它总是会默认的。我不希望使用默认值并获得错误。然后我会为这两个站点添加一个特例。在这种情况下,在我看来,这是一个合理的解决方案,可以解决您的问题-它在一个简单的测试项目中工作-它对您的问题有何影响?