Autofac不是从Multi Target .Net标准库加载模块

时间:2018-05-09 04:14:41

标签: c# .net autofac .net-standard

我正在开发一个Windows服务,我正在引用一个.NET标准库,我有一个Autofac模块,我将这个库称为A。我在csproj中有以下PropertyGroup

<PropertyGroup>
   <TargetFrameworks>net461;netstandard2.0</TargetFrameworks>
</PropertyGroup>

这是之前引用的Autofac模块:

 public class DefaultModule:Module
 {
    protected override void Load(ContainerBuilder builder)
    {
 #if net461
        builder.Register(context => {
            return new BusSettings
            {
                HostAddress = System.Configuration.ConfigurationManager.AppSettings["HostAddress"],
                Username = System.Configuration.ConfigurationManager.AppSettings["Username"],
                Password = System.Configuration.ConfigurationManager.AppSettings["Password"],
                QueueName=System.Configuration.ConfigurationManager.AppSettings["QueueName"]
            };
        }).AsSelf();
 #else
        builder.Register(context => {
            var configuration = context.Resolve<IConfiguration>();
            return new BusSettings
            {
                HostAddress = configuration["BusSettings:HostAddress"],
                Username = configuration["BusSettings:Username"],
                Password = configuration["BusSettings:Password"],
                QueueName = configuration["BusSettings:QueueName"]
            };
        }).AsSelf();
#endif

现在我使用4.61作为Target Framework创建了.NET Framework控制台应用程序。这是我用来加载模块的代码:

 //Library A is loaded By ExtractCustomAssemblyModules
 List<Assembly> assemblies = ExtractCustomAssemblyModules();
 containerBuilder.RegisterAssemblyModules(assemblies.ToArray());//Register custom modules

当我执行containerBuilder.Build()时,我没有看到Autofac加载模块并注册我在自定义模块中的服务,因此它给了我一个例外,因为它找不到依赖项。现在,我创建了一个.NET Core 2控制台应用程序并完全相同,当时调用containerBuilder.Build()代码跳转到模块,我看到服务已注册,这次也不例外

为什么不在.NET框架控制台应用程序中加载Autofac模块?

PS:我发现这个blog非常有用,我将第一个目标框架切换到.NET 4.61,正如您在PropertyGroup中看到的那样,但我仍然看到if中的灰色4.61代码

1 个答案:

答案 0 :(得分:2)

小测试

让我们用

构建一个样本库
frame_to_be_available_and_switch_to_it()

namespace MyClassLibrary
{
    public class Foo
    {
        public static string Info { get; } = "Conditionals"
#if net461
            + " net461"
#endif
#if NET461
            + " NET461"
#endif
#if NETCORE
            + " NETCORE"
#endif
#if NETSTANDARD
            + " NETSTANDARD"
#endif
#if NETSTANDARD2_0
            + " NETSTANDARD2_0"
#endif
            + "";
    }
}

如果我们使用简单的

在.Net Framework 4.6.1+控制台应用程序中引用此库
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>net461;netstandard2.0</TargetFrameworks>
  </PropertyGroup>

</Project>

输出

Conditionals NET461

github: Complete Solution

结论

指令using System; namespace ConsoleApp.NetCore { class Program { static void Main( string[] args ) { Console.WriteLine( MyClassLibrary.Foo.Info ); } } } 未知,但net461 已知

如您所见,尺寸很重要:o)