天天看點

依賴注入入門

1 依賴的例子

建立接口IServiceProvider,代碼如下所示。

namespace InjectExp
{
    public interface IServiceProvider
    {
        void ExecuteServiceMothod();
    }
}
           

建立類ServiceProvider,實作接口IServiceProvider,代碼如下所示。

using System;
namespace InjectExp
{
    public class ServiceProvider:IServiceProvider
    {
        public void ExecuteServiceMothod()
        {
            Console.WriteLine("Excute service provider's method!");
        }
    }
}
           

建立ServiceUser類,ServiceUser類中初始化ServiceProvider類,并調用方法ExecuteServiceMothod()輸出字元串"Excute service provider's method!"。

using System;
namespace InjectExp
{
    public class ServiceUser
    {
        public void DoSomething()
        {
            ServiceProvider serviceProvider = new ServiceProvider();
            serviceProvider.ExecuteServiceMothod();
        }
    }
}
           

編寫使用ServiceUser類的Program類代碼,如下所示。

namespace InjectExp
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceUser serviceUser = new ServiceUser();
            serviceUser.DoSomething();
        }
    }
}
           

下面給出前面代碼中出現的所有對象的關系圖。

依賴注入入門

由圖可以看出,ServiceUser類強依賴于ServiceProvider類。

2 通過依賴注入實作解耦

下面通過依賴注入來實作ServiceUser類與ServiceProvider類的解耦。

建立接口IServiceInjectManager,該接口用于注入的實作。

namespace InjectExp
{
    public interface IServiceInjectManager
    {
        void InjectService(IServiceProvider serviceProvider);
    }
}
           

修改類ServiceUser代碼,使其實作接口IServiceInjectManager。

using System;
namespace InjectExp
{
    public class ServiceUser:IServiceInjectManager
    {
        private IServiceProvider serviceProvider;
        public void InjectService(IServiceProvider serviceProvider)
        {
            this.serviceProvider = serviceProvider;
        }
        public void DoSomething()
        {
            serviceProvider.ExecuteServiceMothod();
        }
    }
}
           

接着,修改Program類的代碼。

namespace InjectExp
{
    class Program
    {
        static void Main(string[] args)
        {
            IServiceProvider serviceProvider = new ServiceProvider();
            ServiceUser serviceUser = new ServiceUser();
            serviceUser.InjectService(serviceProvider);
            serviceUser.DoSomething();
        }
    }
}
           

在Program類中初始化類ServiceProvider,并通過InjectService()方法将初始化後的ServiceProvider執行個體注入類ServiceUser中。

這樣一來,我們就不用在ServiceUser類中實作ServiceProvider類的初始化了。

同樣,給出代碼中所有對象的關系圖。

依賴注入入門

由圖可以看出,此時的ServiceUser類不再依賴于ServiceProvider類,實作了兩者之間的解耦。

3 依賴注入的三種方式

我們這用使用的是Interface注入的方式,除了Interface注入的方式外,還有Constructor注入和Setter注入等方法。

  • Constructor注入

若使用Constructor注入,ServiceUser類的代碼應該如下所示。

using System;
namespace InjectExp
{
    public class ServiceUser
    {
        private IServiceProvider serviceProvider;
        public ServiceUser(IServiceProvider serviceProvider)
        {
            this.serviceProvider = serviceProvider;
        }
        public void DoSomething()
        {
            serviceProvider.ExecuteServiceMothod();
        }
    }
}
           

此時,Program類的代碼應該如下所示。

namespace InjectExp
{
    class Program
    {
        static void Main(string[] args)
        {
            IServiceProvider serviceProvider = new ServiceProvider();
            ServiceUser serviceUser = new ServiceUser(serviceProvider);
            serviceUser.DoSomething();
        }
    }
}
           
  • Setter注入

若使用Setter注入,ServiceUser類的代碼應該如下所示。

using System;
namespace InjectExp
{
   public class ServiceUser
   {
        private IServiceProvider serviceProvider; 
        public IServiceProvider ServiceProvider 
        { 
            get { return serviceProvider; } 
            set { serviceProvider = value; } 
        } 
        public void DoSomething()
        {
            serviceProvider.ExecuteServiceMothod();
        }
    }
}
           

此時,Program類的代碼應該如下所示。

namespace InjectExp
{
    class Program
    {
        static void Main(string[] args)
        {
            IServiceProvider serviceProvider = new ServiceProvider();
            ServiceUser serviceUser = new ServiceUser();
            serviceUser.ServiceProvider = serviceProvider;
            serviceUser.DoSomething();
        }
    }
}
           

4 類構造器Assembler

實作依賴注入後,我們就不再需要在ServiceUser類中執行個體化ServiceProvider類了。

我們還可以引入一個第三方的類Assembler(構造器),讓他專門負責執行個體化ServiceProvider類,而ServiceUser隻需要得到滿足IServiceProvider約定的執行個體就可以了。

此時,Program客戶類就可以使用Assembler類來完成類的執行個體化了。

當然,Assembler還可以為我們做更多的事,我們這裡就不詳細介紹了。

最後給出加入Assembler後的對象關系圖。

依賴注入入門

好了,就到這裡了。