我有一个3层的解决方案
B
C
在C层中,我有接口IRepository,它有两个实现,RepositoryX和RepositoryY。
在层B中,我有接口IController,在层A中我有一个名为Foo的类。现在我知道我可以通过使用约定名称或导出元数据来控制将哪个IRepository实现注入到依赖项中。
在Controller的实现中,我可以说我想要RepositoryX或RepositoryY,这很有效。
在层A中的Foo类中,我对被注入的IController有一个依赖项。我如何在Foo类中控制我的IController将获得哪个IRepository实现?
我会寻找类似的东西:
class Foo
{
[Import("RepositoryX")]
public IController MyController { get; set; }
它将注入一个IController,该IControlle本身有一个类型为RepositoryX的存储库,该存储库被注入控制器的导入属性中。
有没有一种方法可以做到这一点,而不必定义除了哪种类型的存储库之外完全相同的两个控制器?
正如您所说,IController
的实现定义了它使用的具有适当Import
属性的存储库。IController
的实现是使用RepositoryX
还是RepositoryY
在编译时是已知的,因此导入IController
将为您提供使用编译时指定的存储库的IController
实现。
您不能要求使用您选择的存储库的IController
实现,但您可以将存储库作为一个属性,这样您就可以在Foo
实现中导入所需的存储库,并将其设置在控制器中:
class Foo
{
[ImportingConstructor]
public Foo(IController myController,
[Import("RepositoryX")] IRepository repository)
{
myController.Repository = repository;
}
}