如何跨多个层次要求MEF中的特定部分



我有一个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;
}
}

最新更新