В настоящее время мы работаем с большим решением, которое содержит проект 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.
Кроме того, при отладке кажется, что классы в контейнере регистрируются просто отлично - каждый интерфейс сопоставлен с правильным классом реализации.Кажется, что все идет не так, когда мы действительно хотим разрешить зависимость в конструкторе.
У кого-нибудь есть идеи относительно того, почему это может произойти?