Microsoft Unity 使用注意事項

 1. 不要對同一個接口用RegisterType 和 RegisterInstance註冊。

 

即如果某個接口用RegisterType註冊了,再註冊,就只用registerType. 同理RegisterInstance。

 

2. 如果用RegisterInstance註冊了,以後可以用Container.BuildUp 進行屬性注入和方法注入。但不能進行構造注入。

 

3. ContainerControlledLifetimeManager :生命週期同container. ExternallyControlledLifetimeManager :當某個實例沒有引

 

用的時候,就可以Dispose()了。 PerThreadLifetimeManager : 生命週期同所在的線程。

 

 4. 當用PerThreadLifetimeManager時, 要用RegisterType 註冊,而不要用RegisterInstance 。

 

 5. 單例模式:container.RegisterType<ILog, FileLogger>(new ContainerControlledLifetimeManager());

 

 6. 被註冊的類或接口中,當有多於一個的構造函數時且參數個數相同時,應當用 [InjectionConstructor]來聲明哪個構造函數要被

 

container調用 。

 

7. 被註冊的類或接口中,如果有多於一個的構造函數,且沒有聲明InjectionConstructor屬性,則查找最長參數的構造函數,如果最長參

 

數的構造函數多於一個 ,則throw exception.

 

 

 

ASP.NET 中使用 Unity Application Block – 示例

1. 創建IUnityContainer 接口文件 – IUnity.cs

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Practices.Unity;

namespace UnityASPNET
{
    interface IUnity
    {
            IUnityContainer Container { get; }
    }
}

 

2. 創建ILogger接口 – ILogger.cs

namespace Microsoft.Practices.Unity.Tests.TestObjects
{
    // A dummy interface to support testing type mapping
    interface ILogger
    {

    }
}

 

3. 創建ILooger接口的實現類 WebLogger.cs

namespace Microsoft.Practices.Unity.Tests.TestObjects
{
    // A dummy class to support testing type mapping
    public class WebLogger : ILogger
    {
    }
}

 

4. 創建 ASP.NET Global.ascx

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Tests.TestObjects;

namespace UnityASPNET
{
    public class Global : System.Web.HttpApplication, IUnity
    {
        private static UnityContainer _container; // private
靜態成員變量

        public static IUnityContainer Container // public靜態成員變量Container
        {
            get { return _container; }
        }

        IUnityContainer IUnity.Container // 實現 IUnity 接口,返回Continer對象
        {
            get { return Container; }
        }

        protected void Application_Start(object sender, EventArgs e)
        {
            Initialize();
        }

        private static void Initialize()
        {
            // create the container at the application initialization phase.
            if (_container == null)
                _container = new UnityContainer(); //
初始化靜態成員變量_container

            // register type 註冊ILogger 映射
            _container.RegisterType<ILogger, WebLogger>();

        }
    }
}

5. ASP.NET 頁面調用 IUnityContainer 對象

        protected void Page_Load(object sender, EventArgs e)
        {
            IUnity UnityCtx = Context.ApplicationInstance as IUnity;           
            // This should find the WebLogger when trying resolve the ILogger
            ILogger logger = UnityCtx.Container.Resolve<ILogger>();           
            Label1.Text = "Found following ILogger from unity container : "+logger.GetType().FullName.ToString();
        }

發佈了56 篇原創文章 · 獲贊 2 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章