我担心的是,当使用public static void RegisterComponents(Startup startup)
{
var container = new UnityContainer();
// registration
startup.DataProtectionProviderFactory = container.Resolve<IDataProtectionProviderFactory>();
}
或shared_ptr
我坚持一个所有权模型时 - 注入的对象是共享的或我自己的。而且我认为这是次要的责任 - 关注注入对象的生命。
所以,是否违反了SRP - 假设该课程已经承担了一些责任。
一些简单的例子:
unique_ptr
当设计发生变化时 - 我会有许多不同的计算器 - 然后我需要将 class Calculator {
public:
Calculator(std::unique_ptr<Adder> adder) : adder(adder) {}
void add();
private:
std::unique_ptr<Adder> adder;
};
更改为unique_ptr
。因此即使shared_ptr
主要责任(计算)没有改变 - 我也需要改变班级。
对注入对象使用简单引用会不会更好 - 并且只是将注入对象的生命周期责任留给其他类?
答案 0 :(得分:0)
否,我们将成员变量保留在对象中的方式是实现细节,它与Single Responsibility Principle之类的设计原理没有任何关系
为了说明这一点-您可以通过某种私有方法封装对成员的访问权限-这样可以防止在从unique_ptr
更改为shared_ptr
时(反之亦然)更改类实现。
private:
Adder& add();
Adder const& add();
或者您甚至可以更进一步,将Adder封装到某些私有对象中-从而完全避免意外访问“ read” adder变量,例如:
class Calculator
{
class AdderProxy
{
public:
using Type = std::unique_ptr<>;
AdderProxy(AdderType);
void add(...);
};
public:
Calculator(AdderProxy::Type);
private:
AdderProxy adder;
或者您也可以拥有一些one这样的DI库,并在应用程序代码中隐藏所有类型的注入。