【问题标题】:Autofac register assembly typesAutofac 寄存器程序集类型
【发布时间】:2015-01-06 11:11:36
【问题描述】:

在 Castle 中,我曾经执行以下操作来注册来自不同程序集的类型:

Classes.FromAssemblyNamed("MyServer.DAL")
       .Where(type => type.Name.EndsWith("Repository"))
       .WithServiceAllInterfaces()
       .LifestylePerWebRequest(),

在 Autofac 中,我将上面的代码更改为:

builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
       .Where(t => t.Name.EndsWith("Repository"))
       .InstancePerRequest();

对吗?

【问题讨论】:

  • 你运行它时它工作吗?
  • 代码编译并执行,但我认为它不正确,因为我无法再访问我的 api(错误 500)。
  • This 可能会有所帮助

标签: c# asp.net-web-api castle-windsor autofac


【解决方案1】:

这是正确的方法:

builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
       .Where(t => t.Name.EndsWith("Repository"))
       .AsImplementedInterfaces()
       .InstancePerRequest();

【讨论】:

    【解决方案2】:

    对于 UWP 正确的方法有点改变:

       var assemblyType = typeof(MyCustomAssemblyType).GetTypeInfo();
    
       builder.RegisterAssemblyTypes(assemblyType.Assembly)
       .Where(t => t.Name.EndsWith("Repository"))
       .AsImplementedInterfaces()
       .InstancePerRequest();
    

    对于每个程序集,您都采用属于程序集的单一类型并从中检索程序集的链接。然后向构建器提供此链接。重复。

    【讨论】:

      【解决方案3】:

      有时 AppDomain.CurrentDomain.GetAssemblies 不返回依赖项目的程序集。详细解释这里Difference between AppDomain.GetAssemblies and BuildManager.GetReferencedAssemblies

      在这些情况下,我们应该使用项目中的任何类单独获取这些项目程序集并注册其类型。

      var webAssembly = Assembly.GetExecutingAssembly();
      var repoAssembly = Assembly.GetAssembly(typeof(SampleRepository)); // Assuming SampleRepository is within the Repository project
      builder.RegisterAssemblyTypes(webAssembly, repoAssembly)
                  .AsImplementedInterfaces();          
      

      【讨论】:

        【解决方案4】:

        您可以使用As 的谓词重载! 您可以从以"Repository" 结尾的给定类型中获取所有带有GetInterfaces 的接口,然后选择它们实现的第一个接口并注册它。

        var assembly = Assembly.GetExecutingAssembly();
        ContainerBuilder builder = new ContainerBuilder();
        
        builder.RegisterAssemblyTypes(assembly)
            .Where(t => t.Name.EndsWith("Repository"))
            .As(t => t.GetInterfaces()[0]);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多