我正在试图弄清楚当我的库的用户可能想要覆盖各种接口的一些默认实现时,如何最好地实现注册服务的扩展方法。似乎有两种做事方式。
第一种方法是在扩展方法中使用services.TryAdd,这将使您能够在调用主扩展方法之前使用services.Add注册覆盖实现,以便您的实现首先到达那里。这是有效的,因为如果已经为接口注册了某些内容,则不会添加.TryAdd。
如果扩展方法使用普通旧服务。添加而不是.TryAdd,那么您仍然可以覆盖实现,但现在您必须在调用添加默认实现的主扩展方法后注册您的实现。
对我来说,似乎第一种方法是更好的方法。如果你调用services.add不止一次使用不同的接口实现,那么它们都会被注册,你实际上可以依赖于接口的IEnumerable来获取所有这些。但是如果你真的只需要在应用程序中实现一个实现,那么最好不要在集合中有任何额外的实现。显然,如果应用程序确实使用了界面的多个实现,那么您可能希望添加所需的所有实现。
我想知道是否就此或建议达成共识,还是仅仅取决于个人品味。