根据构造函数参数属性使用autoface解决依赖关系

本文关键字:autoface 解决 依赖 关系 构造函数 参数 属性 | 更新日期: 2023-09-27 18:03:20

假设我有两个服务(A和B)都注册为ISomeService。也假设我将在未来需要类,这将需要这些服务之一。但我还不知道类名。我只知道它们正在实现一个给定的接口或抽象类(所有实现给定接口的类都需要ISomeService的相同实例)。我怎样才能确保解决这个问题呢?

这里有一个相关的问题,其中使用已解析服务的类的名称是已知的。但是在我的例子中,类名CustomerRepository的名称是事先不知道的。只有接口(如IUserRepository或IFunctionRepository)或抽象类的名称是已知的。换句话说,我就是知道我必须允许用户编写更多实现IUserRepository的类。

这里有一个更好的提问方式。我需要所有的函数库构造函数得到A(其中A:ISomeService)和所有的IUserRepository构造函数得到B(其中B:ISomeService)

根据构造函数参数属性使用autoface解决依赖关系

您应该问自己的问题是:容器如何知道何时使用哪种实现?如果没有附加信息,容器无法知道这个

而且,对于ISomeService的几个实现,您应该要求客户端始终使用多个实例吗?

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

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

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