智能指针的依赖注入是否违反单一责任原则?

时间:2016-03-11 14:19:17

标签: c++ dependency-injection smart-pointers solid-principles single-responsibility-principle

我担心的是,当使用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主要责任(计算)没有改变 - 我也需要改变班级。

对注入对象使用简单引用会不会更好 - 并且只是将注入对象的生命周期责任留给其他类?

1 个答案:

答案 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库,并在应用程序代码中隐藏所有类型的注入。