Unity层次结构构造函数注入

西南

我在理解Unity如何解析层次结构树下方对象的引用以及如何注入相关构造函数方面遇到困难。

目前,我已将容器配置为:

    container
        .RegisterType<IDataContextAsync, Zeus>("ZeusLive", new PerRequestLifetimeManager(), new InjectionConstructor("ZeusLive"))
        .RegisterType<IDataContextAsync, Zeus>("Zeus", new PerRequestLifetimeManager(), new InjectionConstructor("Zeus"))
        .RegisterType<IUnitOfWorkAsync, UnitOfWork>("ZeusUnitOfWork", new InjectionConstructor(new ResolvedParameter<IDataContextAsync>("Zeus")))
        .RegisterType<IRepositoryAsync<cd_Job>, Repository<cd_Job>>(new InjectionConstructor(new ResolvedParameter<IUnitOfWorkAsync>("ZeusUnitOfWork"), new ResolvedParameter<IDataContextAsync>("Zeus")));

(我使用的是通用的工作单位和存储库模式(https://genericunitofworkandrepositories.codeplex.com/))

问题在于此行:

.RegisterType<IRepositoryAsync<cd_Job>, Repository<cd_Job>>(new InjectionConstructor(new ResolvedParameter<IUnitOfWorkAsync>("ZeusUnitOfWork"), new ResolvedParameter<IDataContextAsync>("Zeus")))

我收到以下错误:

The type Repository.Pattern.Ef6.Repository`1[[DataRepository.Models.cd_Job, DataRepository, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] does not have a constructor that takes the parameters (IUnitOfWorkAsync, IDataContextAsync)

Repository类的构造函数如下:

public Repository(IDataContextAsync context, IUnitOfWorkAsync unitOfWork)
{
    _context = context;
    _unitOfWork = unitOfWork;

    // Temporarily for FakeDbContext, Unit Test and Fakes
    var dbContext = context as DbContext;

    if (dbContext != null)
    {
        _dbSet = dbContext.Set<TEntity>();
    }
    else
    {
        var fakeContext = context as FakeDbContext;

        if (fakeContext != null)
        {
            _dbSet = fakeContext.Set<TEntity>();
        }
    }
}

我怀疑我的问题是我不完全了解如何解决层次结构引用,并且我的错误很明显,但是我仍在学习,因此希望能获得一些指导

丹尼尔·JG

您需要InjectionConstructor按照在构造函数中定义的顺序提供参数的参数

您的构造函数的定义如下:

public Repository(IDataContextAsync context, IUnitOfWorkAsync unitOfWork)
{
}

因此,您需要像这样注册:

.RegisterType<IRepositoryAsync<cd_Job>, Repository<cd_Job>>(
    new InjectionConstructor(
        new ResolvedParameter<IDataContextAsync>("Zeus"),
        new ResolvedParameter<IUnitOfWorkAsync>("ZeusUnitOfWork")))

如您所见,我已经更改了您提供IDataContextAsync的顺序IUnitOfWorkAsync基本上,您使用的方式是,您以错误的顺序提供了参数。


附带说明,您无需为每个注册都提供一个名称。仅在要多次注册同一接口时才需要提供名称,即使在这种情况下,您仍然可以使用默认的未命名注册。

另外,您无需手动告诉Unity如何解析每个构造函数参数,因为默认情况下他足够聪明来解析它(如果它知道如何解析它)。

因此,您的示例可以简化为:

container
    .RegisterType<IDataContextAsync, Zeus>("ZeusLive", new PerRequestLifetimeManager(), new InjectionConstructor("ZeusLive"))
    .RegisterType<IDataContextAsync, Zeus>(new PerRequestLifetimeManager(), new InjectionConstructor("Zeus"))
    .RegisterType<IUnitOfWorkAsync, UnitOfWork>()
    .RegisterType<IRepositoryAsync<cd_Job>, Repository<cd_Job>>();

Unity非常聪明,可以意识到Repository有一个构造函数采用IDataContextAsyncIUnitOfWorkAsync,并为他提供实例,因为他知道如何解析它们。这些接口的默认注册将分别解析为类的实例Zeus(使用构造函数参数Zeus,可能是连接字符串?)UnitOfWork

希望有帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java构造函数-继承层次结构中的执行顺序

来自分类Dev

在构造函数上注入属性

来自分类Dev

C ++结构构造函数

来自分类Dev

SignalR-结构构造函数依赖项注入:Signalr结构图解析器

来自分类Dev

Restler中的构造函数注入

来自分类Dev

对Xsockets构造函数的依赖注入

来自分类Dev

构造函数注入最佳实践

来自分类Dev

动态注入构造函数参数

来自分类Dev

春季构造函数注入

来自分类Dev

MVC 5 Unity构造函数注入失败/返回空

来自分类Dev

结构构造函数调用this()

来自分类Dev

构造函数路径参数的注入

来自分类Dev

帅哥 注入构造函数

来自分类Dev

构造函数注入Dagger 2

来自分类Dev

C#Unity容器构造函数注入列表<childs>

来自分类Dev

如何从NodeList递归构造JSON层次结构?

来自分类Dev

C ++结构构造函数

来自分类Dev

Unity在app.config中注入复杂的构造函数对象

来自分类Dev

在继承层次结构中移动构造函数

来自分类Dev

MVC 5 Unity构造函数注入失败/返回空

来自分类Dev

使用未知构造函数参数的Unity注入实例

来自分类Dev

Java构造函数注入

来自分类Dev

C#Unity容器构造函数注入列表<childs>

来自分类Dev

使用Unity注入构造函数参数

来自分类Dev

Scala类层次结构的设计。构造函数参数与成员

来自分类Dev

Prism.Unity.Forms 将 INavigationService 注入 ViewModel 构造函数

来自分类Dev

层次结构中类型的 CDI 注入

来自分类Dev

在注入构造函数之前注入成员变量

来自分类Dev

减少类层次结构中的构造函数样板代码