.net Unity:如何通过基接口解析类

.net Unity:如何通过基接口解析类,.net,dependency-injection,unity-container,.net,Dependency Injection,Unity Container,这是我的存储库类: public interface IMyRepository : IRepository<IMyEntity>{} public class MyRepository : IMyRepository { ... } 公共接口IMyRepository:IRepository{} 公共类MyRepository:IMyRepository { ... } 以下是注册它的方法: container.Register<IMyRepository, MyRep

这是我的存储库类:

public interface IMyRepository : IRepository<IMyEntity>{}

public class MyRepository : IMyRepository
{
...
}
公共接口IMyRepository:IRepository{}
公共类MyRepository:IMyRepository
{
...
}
以下是注册它的方法:

container.Register<IMyRepository, MyRepository >();
container.Register();
以下是解决存储库问题的方法:

IRepository<IMyEntity> repository = container.Resolve<IRepository<IMyEntity>>();
IRepository repository=container.Resolve();
尝试以这种方式解析存储库时出错:

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

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

解析IRepository`1[IMyEntity],(无)

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

非常感谢

顺便说一下,有时我想通过IMyRepository,有时通过IRepository来解决我的问题。我应该注册两次类吗?

IMyRepository repository=container.Resolve();
IMyRepository repository = container.Resolve<IMyRepository>();
执行以下操作:

container.RegisterType();
相反。根据设计,Unity只进行一个级别的类型映射。它只会根据您要求的类型查找映射,而不会查找继承树

如果您希望它既可以作为IRepository也可以作为IRepository使用,则只需注册两次:

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

为什么需要这个额外的
IMyRepository
接口?这并不能回答问题:-)抱歉:)一些专用存储库有自己的方法(例如,GetMyEntityBySomeCriteria),它们封装了查询逻辑。。。我试图回答你的问题,实际上,我可以用IRepository删除IMyRepository的用法。这需要一些努力,但是。。。还是可行的。。。你认为我需要走这条路吗?也许您最好创建一个答案…?谢谢,很抱歉Unity不支持将继承考虑在内的映射。“将继承考虑在内”实际上是什么意思?我们必须定义它,实现它(当我们在继承图中漫游时,很容易导致N^2或更糟糕的解析时间),记录它,然后回答所有需要与我们构建的定义不同的定义的人。至少这样,事情很简单,容易理解,而且,正如你所看到的,如果你想要一个不同的行为,很容易解决。
container.RegisterType<IRepository<IMyEntity>, MyRepository>()
    .RegisterType<IMyRepository, MyRepository>();