c#Unity依存注入WebService

7199 ワード

1.IOCとDIの紹介
IOCのフルネームはInversion Of Control(制御反転)であり、技術ではなく、思想であり、重要な面相オブジェクトプログラミングの法則であり、松結合、より優れたプログラムをどのように設計するかを知ることができる.従来のアプリケーションでは、クラス内で依存オブジェクトをアクティブに作成し、クラスとクラスの
間高結合で、テストしにくい.IoCコンテナができた後、依存オブジェクトの作成と検索の制御権をコンテナに渡し、コンテナによって組み合わせオブジェクトを注入するので、オブジェクトとオブジェクトの間には緩やかな結合があり、テストも便利で、機能の多重化に有利であり、さらに重要なのはプログラム全体のアーキテクチャを非常に柔軟にすることである.実はIoC
プログラミングに与える最大の変化はコードではなく、思想的に「主従シフト」の変化である.アプリケーションはもともとボスで、どんなリソースを取得するにもアクティブに出撃しますが、IoC/DIの考え方では、アプリケーションはパッシブになり、IoCコンテナが作成され、必要なリソースが注入されるのをパッシブに待っています.
しました.  
IoCは「私たちを探さないで、私たちはあなたを探しています」というオブジェクト向けの設計法則をよく体現しています.すなわち,IoCコンテナが対応する依存オブジェクトを探して注入し,オブジェクトが自発的に探すのではなく,IoCコンテナがオブジェクトを助ける.
DIの全称はDependency Injection(依存注入)であり、コンポーネント間の依存関係はコンテナの稼働期間によって決定される.すなわち、コンテナがある依存関係をコンポーネントに動的に注入することであり、依存注入の目的はソフトウェアシステムがより多くの機能をもたらすことではない.
コンポーネントの再利用頻度を向上させ、システムに柔軟で拡張性のあるプラットフォームを構築するためです.注入メカニズムに依存することで、ターゲットに必要なリソースをコードで指定することなく、簡単な構成でビジネスロジックを完了する必要があります.具体的なリソースがどこから来たのかに関心を持つ必要はありません.
DIのポイントは「誰が誰に頼るのか、なぜ頼る必要があるのか、誰が水を注入するのか、何を注入するのか」
2.Unity IOCプロフィール
Unityは、マイクロソフトによる依存注入(DI)減少結合を実現するためのIOCコンテナです.
コンポーネントアドレス:http://unity.codeplex.com/
3.Unity依存注入によるWeb ServiceDemoの作成
  a.NuGetパッケージを使用したインストールリファレンスの管理
  b.Global.asaxでのコンテナの構成
  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using Microsoft.Practices.Unity;
using WebServiceDemo.Impl;
using WebServiceDemo.Interface;

namespace WebServiceDemo
{
    public class Global : System.Web.HttpApplication,IContainerAccessor
    {

        private static IUnityContainer _container;

        public static IUnityContainer Container {
            get { return _container; }
            set { _container = value; }

        }

        IUnityContainer IContainerAccessor.Container
        {
            get
            {
                return Container;
            }
        }

        protected void Application_Start(object sender, EventArgs e)
        {

            log4net.Config.XmlConfigurator.Configure();
            CreateContainer();
        }

        protected void Session_Start(object sender, EventArgs e)
        {

        }

        protected void Application_BeginRequest(object sender, EventArgs e)
        {

        }

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {

        }

        protected void Application_Error(object sender, EventArgs e)
        {

        }

        protected void Session_End(object sender, EventArgs e)
        {

        }

        protected void Application_End(object sender, EventArgs e)
        {

        }

        protected virtual void CreateContainer()
        {
            IUnityContainer container = new UnityContainer();

            container.RegisterType();          

            Container = container;
        }
    }
}

  
  c.サービスインタフェースベースクラスの作成
  
using Microsoft.Practices.Unity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using WebServiceDemo.Interface;

namespace WebServiceDemo.Services
{
    public abstract class BaseService :System.Web.Services.WebService where T:class
    {
        public BaseService()
        {
            InjectDependencies();
        }

        protected virtual void InjectDependencies()
        {
            HttpContext context = HttpContext.Current;

            if (context == null)
                return;

            IContainerAccessor accessor = context.ApplicationInstance as IContainerAccessor;

            if (accessor == null)
                return;

            IUnityContainer container = accessor.Container;

            if (container==null)
            {
                throw new InvalidOperationException("Container on Global Application Class is Null. Cannot perform BuildUp.");
            }

            container.BuildUp(this as T);
            
        }
    }
}

  d.インプリメンテーション・サービスのインタフェースとインプリメンテーション・クラスの作成
  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WebServiceDemo.Dto;

namespace WebServiceDemo.Interface
{
    public  interface IWebServiceDemo
    {
        RespResult AddResult(int a,int b);
    }
}

  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using WebServiceDemo.customize;
using WebServiceDemo.Dto;
using WebServiceDemo.Interface;

namespace WebServiceDemo.Impl
{
    public class WebServiceDemoImpl : IWebServiceDemo
    {

        private static readonly ILog log = LogManager.GetLogger(typeof(BeingSweptServiceImpl));

        public RespResult AddResult(int a,int b)
        {
            return a+b;

        }
    }
}

  
  e.Webserviceの構成の作成
  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using WebServiceDemo.customize;
using WebServiceDemo.Interface;
using Microsoft.Practices.Unity;
using WebServiceDemo.Dto;

namespace WebServiceDemo.Services
{
    /// 
    /// Summary description for MainSweepService
    /// 
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class ServiceDemoService : BaseService
    {
        [Dependency]
        public IWebServiceDemo _webServiceDemo
        {
            get; set;
        }

        public ServiceDemoService () : base()
        {

        }

        [WebMethod(Description ="  ")]
        public RespResult AddResult(int a,int b)
        {
            return this._webServiceDemo.AddResult(a,b);
        }

    }

}