使用依赖项解析程序的好处可能是使用Ninject而不是使用某些条件语句来解析依赖项

时间:2016-02-26 07:40:35

标签: c# dependency-injection

你好,首先我只是一个新手程序员,我刚刚发现依赖注入模式是如何工作的,它用于使我的代码更松散耦合。我不是特别知道如何配置Ninject来解决依赖关系,使用这些插件是否更好?

目前解决依赖关系的方法就是这样。

public class MyClass
{
    IContract _contract = null;

    MyClass()
    { 
    }

    MyClass(IContract contract)
    {
        _contract = contract;
    }

    public void DoSomething()
    {
        IContract concreteImplementation = _contract ?? new ConcreteContract();

        concreteImplementation.MyMethod();
    }
}
public class ConcreteContract : IContract
{

    public void MyMethod()
    {
        //do something;
    }
}
public interface IContract
{
   void MyMethod();
}

1 个答案:

答案 0 :(得分:1)

...爱德华

我想我会在评论中添加一些细节。 DI的好处就像你提到的那样(松散耦合)。此外,它允许您在编译和运行时注册contract,具体取决于您的要求。因此,您可以添加新的实现,而不会破坏您希望解决的类。

您需要使用Unity轻微的重构来实现目标。下面是一个小的自包含示例(控制台应用程序),使用您的类定义(并显示替代实现):

public class MyClass
{
    readonly IContract _contract = null;

    // do not include a paramterless ctor
    // thus preventing class being created
    // without a concrete implementation of IContract 
    public MyClass(IContract contract)
    {
        _contract = contract;
    }

    public void DoSomething()
    {
        _contract.MyMethod();
    }
} 

public class ConcreteContract : IContract
{

    public ConcreteContract() { }
    public void MyMethod()
    {
        //do something;
        Debug.Print("Hello from the ConcreteContract class");
    }
}

public class PlasticContract : IContract
{

    public PlasticContract() { }
    public void MyMethod()
    {
        //do something;
        Debug.Print("Hello from the PlasticContract class");
    }
}

public interface IContract
{
    void MyMethod();
}

class Program
{
    // add the nuget package Unity 1st
    // Install-Package Unity
    static void Main(string[] args)
    {
        // Declare a Unity Container -
        // normally done once in the Startup/Bootstrap class
        var unityContainer = new UnityContainer();

        // Register IContract so when dependecy is detected
        // it provides a ConcreteContract instance 
        // you could change this to <IContract, PlasticContract>
        unityContainer.RegisterType<IContract, ConcreteContract>();

        // Instance a MyClass class object through Unity
        var preferredClass = unityContainer.Resolve<MyClass>();
        preferredClass.DoSomething();
    }
}

希望这能让你进入下一阶段。