简单注入器注册动态类型

3

你好,我想要自动化注册我的依赖关系。

目前我的做法是:

public interface IRepository<T> where T : class

public interface IFolderRepository : IRepository<Folder>

public class RepositoryBase<T> : IRepository<T>, IDisposable where T : class

public class FolderRepository : RepositoryBase<Folder>, IFolderRepository

我已经注册了这个依赖:

 container.Register<IFolderRepository, FolderRepository>();

所有工作都很好,但在一个地方,我需要使这个过程通用化。例如:

var repository = container.GetInstance<IRepository<TModel>>();

我需要进行注册:

container.Register<IRepository<Folder>, RepositoryBase<Folder>>();

有没有一种好的方式可以将IRepository注册为返回FolderRepository,例如当T : Folder时?
谢谢。

2
为什么要首先拥有IFolderRepository?如果您已经拥有IRepository<Folder>并且正在尝试获取IRepository<Folder>的实例? - decPL
1
这个特定的IFolderRepository接口的确切功能是什么?如果您的意图是添加特定的方法,请不要这样做。 - Steven
1个回答

1
您可以使用RegisterManyForOpenGeneric注册所有通用实例:
container.RegisterManyForOpenGeneric(typeof(IRepository<>),
    typeof(IRepository<>).Assembly);

对于开放类型:

container.RegisterOpenGeneric(typeof(IRepository<>), typeof(RepositoryBase<>));

请查看文档此处


1
RegisterOpenGeneric 的好处在于它使用未注册类型解析,这基本上意味着当没有对 RegisterManyForOpenGeneric 使用闭合接口的显式注册时,它将作为后备机制起作用。 - Steven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接