C# 为什么我要用国际奥委会的团结

C# 为什么我要用国际奥委会的团结,c#,unit-testing,design-patterns,inversion-of-control,unity-container,C#,Unit Testing,Design Patterns,Inversion Of Control,Unity Container,我创建了一个应用于依赖项反转原理的类,并使用了依赖项注入模式,如下所示: public interface ITypeOfPrinter { string Printing(); } public class Print { private readonly ITypeOfPrinter _typeOfPrinter; public Print(ITypeOfPrinter typeOfPrinter) { _typeOfPrinter =

我创建了一个应用于依赖项反转原理的类,并使用了依赖项注入模式,如下所示:

public interface ITypeOfPrinter
{
    string Printing();
}

public class Print
{  
    private readonly ITypeOfPrinter _typeOfPrinter;

    public Print(ITypeOfPrinter typeOfPrinter)
    {
        _typeOfPrinter = typeOfPrinter;
    }

    public string print()
    {
        return _typeOfPrinter.Printing();
    }
}

public class BlackAndWhitePrinter : ITypeOfPrinter
{
    public string Printing()
    {
        NumberOfPrints++;
        return string.Format("it is Black and white printing {0}", NumberOfPrints);
    }

    public int NumberOfPrints { get; set; }

}
public class ColorfullPrinter : ITypeOfPrinter
{
    public string Printing()
    {
        NumberOfPrints++;
        return string.Format("it is colorfull printing {0}", NumberOfPrints);
    }
    public int NumberOfPrints { get; set; }
}
ITypeOfPrinter typeofprinter = new BlackAndWhitePrinter();
Print hp = new Print(typeofprinter);
hp.print();
因此,如果我想使用
BlackAndWhitePrinter
,我只需创建一个实例对象,并将其交给我的Print类,构造如下:

public interface ITypeOfPrinter
{
    string Printing();
}

public class Print
{  
    private readonly ITypeOfPrinter _typeOfPrinter;

    public Print(ITypeOfPrinter typeOfPrinter)
    {
        _typeOfPrinter = typeOfPrinter;
    }

    public string print()
    {
        return _typeOfPrinter.Printing();
    }
}

public class BlackAndWhitePrinter : ITypeOfPrinter
{
    public string Printing()
    {
        NumberOfPrints++;
        return string.Format("it is Black and white printing {0}", NumberOfPrints);
    }

    public int NumberOfPrints { get; set; }

}
public class ColorfullPrinter : ITypeOfPrinter
{
    public string Printing()
    {
        NumberOfPrints++;
        return string.Format("it is colorfull printing {0}", NumberOfPrints);
    }
    public int NumberOfPrints { get; set; }
}
ITypeOfPrinter typeofprinter = new BlackAndWhitePrinter();
Print hp = new Print(typeofprinter);
hp.print();
那么,为什么我要在这里使用统一或其他国际奥委会框架呢?我已经做了我想做的事情,如上所述:

var unityContainer = new UnityContainer();
unityContainer.RegisterType<ITypeOfPrinter, BlackAndWhitePrinter>();
var print = unityContainer.Resolve<Print>();
string colorfullText = print.print();
var unityContainer=new unityContainer();
unityContainer.RegisterType();
var print=unityContainer.Resolve();
字符串colorfullText=print.print();

依赖项注入作为一种模式有助于提高应用程序代码的可维护性。DI框架(也称为IoC容器)有助于提高可维护性


但是,如果IoC容器无助于使您的合成根目录更易于维护,那么不要在这种情况下使用它!然而,这并不意味着你不应该使用依赖注入或其他模式和原则来帮助你的软件更易于维护。你应该尽一切努力降低你正在构建的软件的成本。

作为Steven答案的补充,使用IOC框架有几个令人信服的理由,这些理由不适用于你给出的简单示例,但可以轻松应用于更复杂的应用程序;但我同意,如果你觉得它没有带来好处,你实际上不必使用它

类不是由您直接创建的,而是由框架创建的。 这方面的典型示例是
ASP.NET
控制器
/
ApiController
。您永远不会自己实例化这些,ASP.NET框架会为您实现这一点。在这种情况下,如果控制器具有依赖项,那么IOC框架允许您通过控制器上的接口轻松声明这些依赖项,而不必担心它们是如何提供的

这将解耦类,并允许更轻松的单元测试,因为您可以模拟/存根依赖项

当需要构造复杂的对象图时。下面是我正在从事的一个项目的一个匿名但真实的图表: 我不知道你的情况,但当我需要一个新的IDeathStar时,我不想输入这个(更不用说尝试维护或调试了),我更愿意说

var moon= IOCFrameworkOfChoice.Resolve<IDeathStar>();

您不必使用IoC容器来符合依赖项反转原则。参见。+1了解
新的前车门保险杠(new Ouch())
:-)我喜欢CriticalVulnerabilityIgnorer(),如果他们有单元测试的话。。。。