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への永続化をサポートすることができる.
       
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