【问题标题】:Resolve dependency with autofac based on constructor parameter attribute基于构造函数参数属性使用autofac解决依赖关系
【发布时间】:2011-07-25 16:08:24
【问题描述】:

假设我有两个服务(A 和 B)都注册为 ISomeService。还假设我将来需要需要这些服务之一的课程。但我还不知道类名。我所知道的是它们正在实现给定的接口或抽象类(实现给定接口的所有类都需要相同的 ISomeService 实例)。如何确保此解决方案发生?

Here is a related question where the name of the class which uses the resolved service is known. 但在我的情况下,类名 CustomerRepository 的名称是未知的。只有接口(如 IUserRepository 或 IFunctionRepository)或抽象类的名称是已知的。换句话说,我只知道 SomeRepository:IUserRepository 和 IUserRepository 类型需要 A。我必须允许用户编写更多实现 IUserRepository 的类。

这是提出问题的更好方法。 我需要所有 IFunctionRepository 构造函数来获取 A(where A:ISomeService) 和所有 IUserRepository 构造函数来获取 B(where B:ISomeService)

【问题讨论】:

    标签: c# .net-4.0 ioc-container autofac


    【解决方案1】:

    您应该问自己的问题是:容器如何知道何时使用哪个实现?没有其他信息,容器无法知道这一点。

    此外,对于ISomeService 的多个实现,您是否应该要求客户端始终使用多个实例?

    通常我认为像IUserRepository 这样的服务在任何时候都只有一个实现。当然,您可以删除一种实现并使用另一种,但客户端类只需要一个实例,而不需要多个实例。

    如果您的容器确实包含同一接口的多个实现,那么客户端类接受多个实例应该是有意义的,或者至少有一些元数据来知道要使用哪个实现。

    让客户端使用 Autofac 接受多个实例就像依赖 IEnumerable<ISomeService> 一样简单,容器将移交所有实例。如果客户端类应该对使用哪个实例做出一些明智的决定,您应该使用元数据来增加注册。您涉及的问题以类本身的形式使用某种元数据。更好的方法可能是使用更解耦的元数据形式。关于如何在 Autofac 中实现的讨论可以在 here 找到。

    【讨论】:

    • 感谢您难得的回复
    • @ada - 谢谢!稀有的? :) 希望你觉得它有用。如果是这样,请将我的答案标记为已接受。
    • 我的意思是很少有人关心甚至至少查看这个问题。 :)
    • 我明白你的意思 :) 我尝试跟进所有与 Autofac 相关的问题,这是一个很棒的图书馆 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多