假设我有两个服务(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(其中A:ISomeService)和所有IUserRepository构造函数来获取B(其中B:ISomeService)
答案 0 :(得分:2)
您应该问自己的问题是:容器如何知道何时使用哪种实现?如果没有其他信息,容器就无法知道这一点。
而且,对于ISomeService
的多个实现,您是否应该要求客户端始终使用多个实例?
通常我认为像IUserRepository
这样的服务在任何时候都只有一个实现。当然,您可以删除一个实现并使用另一个实现,但客户端类只需要一个实例,而不是几个实例。
如果您的容器确实包含多个相同接口的实现,那么客户端类接受多个实例或者至少有一些元数据来了解要使用的实现应该是有意义的。
对于客户端,使用Autofac接受多个实例就像对IEnumerable<ISomeService>
依赖一样简单,容器将移交所有实例。如果客户端类应该对要使用的实例做出一些明智的决定,那么您应该使用元数据来扩充注册。您涉及的问题是以类本身的形式使用某种元数据。更好的方法可能是使用更加分离的元数据形式。有关如何在Autofac中实现此问题的讨论可以在here找到。