Autofac не загружает модуль из библиотеки Multi Target .Net Standard - PullRequest
0 голосов
/ 09 мая 2018

Я занимаюсь разработкой службы Windows и ссылаюсь на библиотеку .NET Standard, где у меня есть модуль Autofac. Я собираюсь назвать эту библиотеку как A. У меня есть следующее PropertyGroup в csproj:

<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

Теперь я создал консольное приложение .NET Framework, используя 4.61 в качестве Target 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(), код переходит к модулю, и я вижу, что службы зарегистрированы и на этот раз не исключение

Почему модуль Autofac не загружается в консольное приложение .NET Framework?

PS: я нашел этот блог действительно полезным, я переключил первый целевой фреймворк на .NET 4.61, как вы можете видеть в PropertyGroup, но все же я вижу серый 4.61 код внутри if .

1 Ответ

0 голосов
/ 09 мая 2018

Маленький тест

Позволяет создать библиотеку образцов с

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
            + "";
    }
}

и

<Project Sdk="Microsoft.NET.Sdk">

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

</Project>

Если мы ссылаемся на эту библиотеку в консольном приложении .Net Framework 4.6.1+ с простым

using System;

namespace ConsoleApp.NetCore
{
    class Program
    {
        static void Main( string[] args )
        {
            Console.WriteLine( MyClassLibrary.Foo.Info );
        }
    }
}

вывод

Conditionals NET461

github: полное решение

Заключение

Директива net461 является неизвестной , но NET461 является известной .

Как видите, размер имеет значение: o)

...