Разрешение стандарта .net 2.0 с единицей (DI) в .NET 4.7.2 - PullRequest
0 голосов
/ 03 декабря 2018

В настоящее время мы работаем с большим решением, которое содержит проект WCF (.NET Framework 4.7.2) вместе с несколькими библиотеками .NET Standard 2.0.

Мы пытаемся зарегистрировать эти библиотеки в Unity (DI).Загрузка библиотек в контейнере работает нормально.Однако разрешить эти классы в конструкторе не удается.

Unity.Exceptions.ResolutionFailedException: 'Resolution of the dependency 
failed, type = 'PROJECTNAME.Service.ITypeDependentonDbContext', name = '(none)'.
Exception occurred while: while resolving.
Exception is: InvalidOperationException - The current type, 
PROJECTNAME.DAL.Repositories.Interfaces.IDbContext, is an interface 
and cannot be constructed. Are you missing a type mapping?

В частности, каждая библиотека имеет класс ModuleInit, в котором мы регистрируем типы в ModuleRegistrar (для MEF2) следующим образом:

 public void Initialize(IModuleRegistrar registrar)
    {
        registrar.RegisterType<IDbContext, DbContext>();
        // etc 
    }

Затем в нашем проекте .NET Frameworkмы регистрируем типы в контейнере Unity:

   protected override void ConfigureContainer(IUnityContainer container)
        {
            container
               .RegisterType<ISomeService, SomeService>()
               .RegisterType<ITypeDependentonDbContext, TypeDependentonDbContext>();
                //etc
             ModuleLoader.LoadContainer(container, ".\\bin", "*.*.dll");
        }

Наконец, в классе в проекте .NET Framework у нас есть

public class SomeService : ISomeService
{
    private readonly ITypeDependentonDbContext _typeDependentonDbContext;

    /// <summary>
    /// constructor
    /// </summary>
    /// <param name="typeDependentonDbContext"></param>
    public SomeService(ITypeDependentonDbContext typeDependentonDbContext)
    {
        _typeDependentonDbContext = typeDependentonDbContext ?? throw new ArgumentNullException(nameof(typeDependentonDbContext));
    }
}

Странно то, что исключение не выдаетсяесли мы зарегистрируем ВСЕ типы, от которых мы зависим, непосредственно в контейнере.Это в отличие от существующего решения .NET Framework, где мы регистрируем каждый тип в классе moduleInit этого проекта, точно так, как представлено здесь.Однако, похоже, что это не работает с проектами стандарта .NET 2.0.

Кроме того, при отладке кажется, что классы в контейнере регистрируются просто отлично - каждый интерфейс сопоставлен с правильным классом реализации.Кажется, что все идет не так, когда мы действительно хотим разрешить зависимость в конструкторе.

У кого-нибудь есть идеи относительно того, почему это может произойти?

...