依赖倒置.对象创建

tov*_*sev 8 c# dependency-injection solid-principles

根据SOLID原则,类不能依赖于其他类,必须注入依赖项.这很简单:

class Foo
{
    public Foo(IBar bar)
    {
        this.bar = bar;
    }

    private IBar bar;
}

interface IBar 
{
}

class Bar: IBar 
{
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我希望我的Foo类能够创建Bar,而不知道IBar背后的确切实现呢?我可以在这里考虑4种解决方案,但所有这些解决方案似乎都有缺点:

  1. 注入对象类型并使用反射
  2. 使用泛型
  3. 使用"服务定位器"并调用Resolve()方法.
  4. 创建一个单独的工厂类并将其注入Foo:

class Foo
{
    public void DoSmth(IBarCreator barCreator) 
    {
        var newBar = barCreator.CreateBar();
    }
}

interface IBarCreator 
{
    IBar CreateBar();
}

class BarCreator : IBarCreator
{
    public IBar CreateBar()
    {
        return new Bar();
    }
}
Run Code Online (Sandbox Code Playgroud)

最后一种情况看起来很自然,但BarCreator类的代码太过分了.那你觉得怎么样,哪个最好?

小智 0

我觉得当你说“我希望我的 Foo 类能够创建 Bar 类”时,又一条规则开始发挥作用,那就是“关注点分离”。因此,您应该将类​​创建的任务委托给其他任务,而 Foo 不应该担心该任务。