【问题标题】:How to ask for a specific part in MEF across several layers如何跨多个层请求 MEF 中的特定部分
【发布时间】:2012-10-29 19:18:56
【问题描述】:

我有一个 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,它本身有一个类型为 RepositoryX 的存储库,该存储库注入到控制器的导入属性中。

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

【问题讨论】:

    标签: c# inversion-of-control mef


    【解决方案1】:

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

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

    class Foo
    {
        [ImportingConstructor]
        public Foo(IController myController,
                   [Import("RepositoryX")] IRepository repository)
        {
            myController.Repository = repository;
        }
    }
    

    【讨论】:

    • 我对这个解决方案的问题是它破坏了我层的封装。为此,我必须在我的最高层 A 中引用数据层 C 中定义的接口。我想如果我遵循依赖倒置原则,我的接口应该在 B 层,但那不是我的情况。跨度>
    猜你喜欢
    • 1970-01-01
    • 2021-09-22
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 2018-01-26
    相关资源
    最近更新 更多