Microsoftを使用Practices.Unity依存注入
22004 ワード
UnityはマイクロソフトのPatterns&Practicesチームが開発した軽量級で、拡張可能な依存注入(Dependency Injection)容器であり、コンストラクタ注入(Constructor Injection)、属性注入(Property Injection)、およびメソッド呼び出し注入(Method Call Injection)の3つの依存注入方式をサポートする.
次のシーンコードがあるとします.コードの中に簡単なcustomerオブジェクトがあります.customerオブジェクトにはsaveメソッドがあります.このメソッドはICustomerDataAccessを呼び出すことによってです.Saveはデータをデータベースに永続化し、列の中でdataaccessのsqlバージョンとmysqlバージョンを実現した.つまり、このcustomerオブジェクトは、sql serverまたはmysqlへの永続化をサポートすることができる.
従来の方法は、コンフィギュレーションファイルにいくつかの変数dbType=sql or my sqlを記入することである.そしてcustomerオブジェクトにおいて設定db typeに従って異なるdataaccessを実力化する.
コードは次のようになります.このようにすると、customerオブジェクトは実際にはCustomerSqlDataAccessとCustomerSqlDataAccessに依存します.また、将来、他のデータベースのサポートを新たに追加するには、customerオブジェクトのソースコードを変更する必要があります.
次にunityを使用して、CustomerSqlDataAccessおよびCustomerSqlDataAccessへのcustomerオブジェクトの依存性を解除します.
一、属性注入(Property Injection)
1. 構成unity
後で呼び出しを容易にするために,ここでは静的手法を確立し,2つのdataaccessを注入した.
その後、Main関数でこのメソッドを呼び出してunity containterを構成する必要があります.
2. タグ属性注入
これは簡単で、customerクラスのICustomerDataAccess定義に[Dependency]寸法を直接追加すればよい.
3. オブジェクトをresoveで取得
上記のコードは、CustomerSqlDataAccessインスタンスとCustomerSqlDataAccessインスタンスをそれぞれ取得しています.
二、コンストラクタ注入(Constructor Injection)
1. 構成unity
2行の登録customerペアを追加container.
2.取得
三、メソッド呼び出し注入(Method Call Injection)
メソッド呼び出し注入と入力注入は少し似ていますが、呼び出しメソッドに[InjectionMethod]寸法を追加するだけです.
1. 構成unity
2.取得
完了したコードは次のとおりです.
さて、unity依存注入を使用することにより、customerオブジェクトは特定のCustomerSqlDataAccessおよびCustomerMysqlDataAccessに依存する.インタフェースICustomerDataAccessのみに依存します.
上にunityの基本的な使い方を紹介します.
転載先:https://www.cnblogs.com/slardar1978/p/4205394.html
次のシーンコードがあるとします.コードの中に簡単なcustomerオブジェクトがあります.customerオブジェクトにはsaveメソッドがあります.このメソッドはICustomerDataAccessを呼び出すことによってです.Saveはデータをデータベースに永続化し、列の中でdataaccessのsqlバージョンとmysqlバージョンを実現した.つまり、このcustomerオブジェクトは、sql serverまたはmysqlへの永続化をサポートすることができる.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Practices.Unity;
namespace UnitySample
{
public interface ICustomerDataAccess
{
void Save(Customer c);
}
public class CustomerSqlDataAccess : ICustomerDataAccess
{
public void Save(Customer c)
{
Console.Write("{2}, save data id:{0},name{1}",c.Id,c.Name,this.GetType().ToString());
}
}
public class CustomerMysqlDataAccess : ICustomerDataAccess
{
public void Save(Customer c)
{
Console.Write("{2}, save data id:{0},name{1}", c.Id, c.Name, this.GetType().ToString());
}
}
public class Customer
{
public ICustomerDataAccess CustomerDataAccess { get; set; }
public string Id { get; set; }
public string Name { get; set; }
public void Save()
{
CustomerDataAccess.Save(this);
}
}
class Program
{
static void Main(string[] args)
{
}
}
}
従来の方法は、コンフィギュレーションファイルにいくつかの変数dbType=sql or my sqlを記入することである.そしてcustomerオブジェクトにおいて設定db typeに従って異なるdataaccessを実力化する.
コードは次のようになります.このようにすると、customerオブジェクトは実際にはCustomerSqlDataAccessとCustomerSqlDataAccessに依存します.また、将来、他のデータベースのサポートを新たに追加するには、customerオブジェクトのソースコードを変更する必要があります.
public Customer()
{
if (DbType = "sql")
{
CustomerDataAccess = new CustomerSqlDataAccess();
}
else
{
CustomerDataAccess = new CustomerSqlDataAccess();
}
}
次にunityを使用して、CustomerSqlDataAccessおよびCustomerSqlDataAccessへのcustomerオブジェクトの依存性を解除します.
一、属性注入(Property Injection)
1. 構成unity
後で呼び出しを容易にするために,ここでは静的手法を確立し,2つのdataaccessを注入した.
public class UnitySetup
{
public static void Config()
{
var container = new UnityContainer();
container.RegisterType();
container.RegisterType("mysql");
}
}
その後、Main関数でこのメソッドを呼び出してunity containterを構成する必要があります.
static void Main(string[] args)
{
UnitySetup.Config();
}
2. タグ属性注入
これは簡単で、customerクラスのICustomerDataAccess定義に[Dependency]寸法を直接追加すればよい.
[Dependency]
public ICustomerDataAccess CustomerDataAccess { get; set; }
3. オブジェクトをresoveで取得
var container = new UnityContainer();
UnitySetup.Config(container);
var sqlCustomer = container.Resolve();
var mysqlCustomer = container.Resolve("mysql");
上記のコードは、CustomerSqlDataAccessインスタンスとCustomerSqlDataAccessインスタンスをそれぞれ取得しています.
二、コンストラクタ注入(Constructor Injection)
1. 構成unity
unityContainer.RegisterType(
new InjectionConstructor(new ResolvedParameter()));
unityContainer.RegisterType("mysqlCustomer",
new InjectionConstructor(new ResolvedParameter("mysql")));
2行の登録customerペアを追加container.
2.取得
var sqlCustomer = container.Resolve();
var myqlCustomer = container.Resolve("mysqlCustomer");
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Practices.Unity;
namespace UnitySample
{
public interface ICustomerDataAccess
{
void Save(Customer c);
}
public class CustomerSqlDataAccess : ICustomerDataAccess
{
public void Save(Customer c)
{
Console.WriteLine("{2}, save data id:{0},name{1}",c.Id,c.Name,this.GetType().ToString());
}
}
public class CustomerMysqlDataAccess : ICustomerDataAccess
{
public void Save(Customer c)
{
Console.WriteLine("{2}, save data id:{0},name{1}", c.Id, c.Name, this.GetType().ToString());
}
}
public class UnitySetup
{
public static void Config(IUnityContainer unityContainer)
{
unityContainer.RegisterType();
unityContainer.RegisterType("mysql");
unityContainer.RegisterType(
new InjectionConstructor(new ResolvedParameter()));
unityContainer.RegisterType("mysqlCustomer",
new InjectionConstructor(new ResolvedParameter("mysql")));
}
}
public class Customer
{
private ICustomerDataAccess CustomerDataAccess { get; set;}
public string Id { get; set; }
public string Name { get; set; }
public Customer(ICustomerDataAccess customerDataAccess)
{
CustomerDataAccess = customerDataAccess;
}
public void Save()
{
CustomerDataAccess.Save(this);
}
}
class Program
{
static void Main(string[] args)
{
var container = new UnityContainer();
UnitySetup.Config(container);
var sqlCustomer = container.Resolve();
var myqlCustomer = container.Resolve("mysqlCustomer");
sqlCustomer.Save();
myqlCustomer.Save();
Console.ReadKey();
}
}
}
三、メソッド呼び出し注入(Method Call Injection)
メソッド呼び出し注入と入力注入は少し似ていますが、呼び出しメソッドに[InjectionMethod]寸法を追加するだけです.
1. 構成unity
unityContainer.RegisterType("mysqlCustomer",
new InjectionMethod("SetDataAccess", new ResolvedParameter("mysql")));
2.取得
var sqlCustomer = container.Resolve();
var myqlCustomer = container.Resolve("mysqlCustomer");
完了したコードは次のとおりです.
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Practices.Unity;
namespace UnitySample
{
public interface ICustomerDataAccess
{
void Save(Customer c);
}
public class CustomerSqlDataAccess : ICustomerDataAccess
{
public void Save(Customer c)
{
Console.WriteLine("{2}, save data id:{0},name{1}",c.Id,c.Name,this.GetType().ToString());
}
}
public class CustomerMysqlDataAccess : ICustomerDataAccess
{
public void Save(Customer c)
{
Console.WriteLine("{2}, save data id:{0},name{1}", c.Id, c.Name, this.GetType().ToString());
}
}
public class UnitySetup
{
public static void Config(IUnityContainer unityContainer)
{
unityContainer.RegisterType();
unityContainer.RegisterType("mysql");
unityContainer.RegisterType("mysqlCustomer",
new InjectionMethod("SetDataAccess", new ResolvedParameter("mysql")));
}
}
public class Customer
{
private ICustomerDataAccess CustomerDataAccess { get; set;}
public string Id { get; set; }
public string Name { get; set; }
public void Save()
{
CustomerDataAccess.Save(this);
}
[InjectionMethod]
public void SetDataAccess(ICustomerDataAccess dataAccess)
{
CustomerDataAccess = dataAccess;
}
}
class Program
{
static void Main(string[] args)
{
var container = new UnityContainer();
UnitySetup.Config(container);
var sqlCustomer = container.Resolve();
var mysqlCustomer = container.Resolve("mysqlCustomer");
sqlCustomer.Save();
mysqlCustomer.Save();
Console.ReadKey();
}
}
}
さて、unity依存注入を使用することにより、customerオブジェクトは特定のCustomerSqlDataAccessおよびCustomerMysqlDataAccessに依存する.インタフェースICustomerDataAccessのみに依存します.
上にunityの基本的な使い方を紹介します.
転載先:https://www.cnblogs.com/slardar1978/p/4205394.html