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後的對象關系圖。
好了,就到這裡了。