【问题标题】:Unity: how to resolve class through base interfaceUnity:如何通过基接口解析类
【发布时间】:2010-12-01 04:08:57
【问题描述】:

这是我的存储库类:

public interface IMyRepository : IRepository<IMyEntity>{}

public class MyRepository : IMyRepository
{
...
}

注册方法如下:

container.Register<IMyRepository, MyRepository >();

这是我想要解决存储库的方式:

IRepository<IMyEntity> repository = container.Resolve<IRepository<IMyEntity>>();

尝试以这种方式解析存储库会报错:

依赖项解析失败,type = "CMCore.Repository.IRepository`1[CMCore.Data.ICmCoreLog]",name = "(none)"。 异常发生时:解决时。

异常是:InvalidOperationException - 当前类型 IRepository`1[IMyEntity] 是一个接口,无法构造。您是否缺少类型映射?

发生异常时,容器为:

正在解析 IRepository`1[IMyEntity],(none)

我的方法有什么问题?实现上述功能的正确方法是什么?

非常感谢!

附:有时我想通过 IMyRepository 解决我的课程,有时通过 IRepository。我应该注册两次课程吗?

【问题讨论】:

  • 你为什么需要这个额外的IMyRepository接口?
  • 这不能回答问题:-)
  • 对不起,:) 一些专门的存储库有自己的方法(例如,GetMyEntityBySomeCriterias),它们封装了查询逻辑......试图回答你的问题,实际上,我可以删除 IMyRepository 的使用IRepository。这需要一些努力,但是……还是可行的……你觉得我需要走这条路吗?也许您最好创建一个答案...?

标签: .net dependency-injection unity-container


【解决方案1】:

做:

container.RegisterType<IRepository<IMyEntity>, MyRepository>();

相反。根据设计,Unity 只进行一层类型映射。它只会从您询问的类型中寻找映射,不会追踪继承树。

如果您希望它同时作为 IRepository 或 IMyRepository 可用,则只需注册两次:

container.RegisterType<IRepository<IMyEntity>, MyRepository>()
    .RegisterType<IMyRepository, MyRepository>();

【讨论】:

  • 谢谢,很遗憾Unity不支持考虑继承的映射。
  • “考虑继承”究竟是什么意思?我们必须定义它,实现它(这很容易导致 N^2 或更糟糕的解决时间,因为我们在继承图上徘徊),记录它,然后回答所有想要与我们构建的定义不同的人.至少通过这种方式,事情变得简单、易于理解,并且如您所见,如果您想要不同的行为,也很容易解决。
【解决方案2】:
IMyRepository repository = container.Resolve<IMyRepository>();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多