1

我有一个 3 层的解决方案

一个

C

在 C 层,我有接口 IRepository,它有两个实现,RepositoryX 和 RepositoryY。

在 B 层,我有接口 IController,在 AI 层有一个名为 Foo 的类。现在我知道我可以通过使用合同名称或导出元数据来控制 IRepository 的哪个实现被注入到依赖项中。

在 Controller 的实现中,我可以说我想要 RepositoryX 或 RepositoryY 并且可以。

在 A 层中的类 Foo 中,我对注入的 IController 有一个依赖项。如何在 Foo 类中控制我的 IController 将获得哪个 IRepository 实现?

我会寻找类似的东西:

class Foo  
{
    [Import("RepositoryX")]
    public IController MyController { get; set; }

这将注入一个 IController,它本身具有一个类型为 RepositoryX 的存储库,该存储库注入到控制器的导入属性中。

有没有一种方法可以做到这一点,而不必定义除了哪种类型的存储库之外相同的 2 个控制器?

4

1 回答 1

1

正如您所说,您的实现IController定义了它使用适当Import属性的存储库。无论您的实现是IController使用RepositoryX还是RepositoryY在编译时已知,因此导入IController将为您提供IController使用在编译时指定的存储库的实现。

您不能要求IController使用您选择的存储库的实现,但您可以将存储库设置为属性,以便您可以在Foo实现中导入所需的存储库并将其设置在控制器中:

class Foo
{
    [ImportingConstructor]
    public Foo(IController myController,
               [Import("RepositoryX")] IRepository repository)
    {
        myController.Repository = repository;
    }
}
于 2012-10-29T21:04:30.680 回答