1
7
经过几年的经验,我发现 装饰器模式 非常适合这个。 实施:
用法:
这种模式非常棒,因为您可以将行为封装在单独的类中,而无需中断更改,并且只在真正需要时使用它们。 |
2
4
正如您所问的,这里有一个通过组合而不是继承来解决这个问题的非常基本和粗糙的示例。
现在,这里的抽象基类和每个子存储库类将只依赖于
这样,您的子存储库只提供
|
3
0
可能有点晚了,但您可以在构造函数中使用IServiceProvider: 持久性库中包含的抽象存储库:
库用户创建的具体存储库:
这样,每个类都可以利用自己的服务,而不需要任何交叉依赖。 这种方法有缺点。首先,这是一种带有抽象定位器的服务定位器(anti)模式,但这并不意味着它不应该在任何地方使用。公正地对待它,确保没有更好的解决方案。 其次,没有编译时强制为任何存储库类提供必要的服务实现。也就是说,如果您不将IServiceA的具体实现放到服务提供者中,这仍然会编译。然后,它将在运行时失败。然而,在这种情况下,这是您的要求之一。 |
4
-3
“我只限于永远不更改基类构造函数”的结论纯粹是证明IoC容器“模式”有多重是有害的。 假设您有一个asp应用程序,并且希望能够以每次his会话转到新文件时的方式为特定用户启用日志记录。使用IoC容器/服务定位器/ASP控制器构造函数是不可能实现的。您可以做什么:在每次会话开始时,您应该创建这样的记录器,并将其准确地传递给所有构造函数(服务实现等)。没有其他方法。IoC容器中没有“每会话”生命周期这样的东西,但这只是实例自然应该存在于ASP中的一种方式(意味着多用户/多任务应用程序)。 如果您没有通过构造函数使用DI,那么您肯定是做错了什么(对于ASP.CORE和EF.CORE来说,这是真的-不可能看到他们如何通过抽象泄漏折磨每个人和自己:您能想象添加自定义记录器会破坏DbContext吗 https://github.com/aspnet/EntityFrameworkCore/issues/10420 这是正常的吗? 仅从DI配置或动态插件获取(但如果您没有动态插件,请不要考虑任何依赖关系“因为它可能是动态插件”),然后通过构造函数执行所有DI标准经典方式。 |
Brendan · Java中从父类继承的对象的ArrayList 2 年前 |
Tali · 继承-您应该使用基类,还是它们只是子类的框架? 2 年前 |
mask2 · 如何轻松访问继承类的功能? 2 年前 |
Dimon · 父类中的Setter,以及一些没有参数的子类 2 年前 |
Miguerurso · Javascript类继承无法正常工作 2 年前 |
GuessMe · 返回新类对象的正确方法(也可以扩展) 2 年前 |
Daniel Lizik · 重写父类构造函数的子类成员初始值设定项 2 年前 |
i_know_what · 以基类作为参数重写错误的方法 2 年前 |