C# Unity IOC容器以及对象的生命周期设置

1、NuGet引入Unity和Unity.Configuration;
2、新建接口ILanguage

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Unity.IOC.Framework.Api.Models
{
    public interface ILanguage
    {
        string GetContent();
    }
}

3、新建类Chinese和English

(1)Chinese类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Unity.IOC.Framework.Api.Models
{
    public class Chinese:ILanguage
    {
        public string GetContent() {
            return " This is Chinese!";
        }
    }
}

(2)English类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Unity.IOC.Framework.Api.Models
{
    public class English:ILanguage
    {
        public string GetContent() {
            return "This is English!";
        }
    }
}

4、新建类ServiceLocator

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using Microsoft.Practices.Unity.Configuration;
using System.Configuration;
using Unity.Resolution;

namespace Unity.IOC.Framework.Api
{
    public class ServiceLocator : IServiceProvider
    {
        private readonly IUnityContainer _container;
        private static readonly ServiceLocator instance = new ServiceLocator();
        private ServiceLocator()
        {
            UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
            _container = new UnityContainer();            
            section.Configure(_container);

        }

        public static ServiceLocator Instance
        {
            get { return instance; }
        }

        public object GetService(Type serviceType)
        {
            return _container.Resolve(serviceType);
        }

        /// <summary>
        /// 获取依赖实例
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public T GetService<T>()
        {            
            return _container.Resolve<T>();
        }

        /// <summary>
        /// 获取依赖实例
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="obj"></param>
        /// <returns></returns>
        public T GetService<T>(params ParameterOverride[] obj)
        {
            return _container.Resolve<T>(obj);
        }

        /// <summary>
        /// 获取依赖实例
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="name">别名</param>
        /// <param name="obj"></param>
        /// <returns></returns>
        public T GetService<T>(string name,params ParameterOverride[] obj)
        {
            return _container.Resolve<T>(name, obj);
        }
    }
}

5、web.config的configuration下配置节点

<!--unity配置 start-->
	<configSections>
		<!--Microsoft.Practices.Unity.Configuration.UnityConfigurationSection: 命名空间 + 类名-->
		<!--Unity.Configuration: 类库名称/程序集名称 -->
		<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/>
	</configSections>
	<unity>
		<container>
			<!--type对应值-->
			<!--type:容器中配置的源类型。如果这是映射注册,这就是映射的起始对象的类型;如果这是单件注册,这就是对象的类型。此属性是必须的。-->
			<!--Unity.IOC.Framework.Api.Models.ILanguage:命名空间 + 接口名-->
			<!--Unity.IOC.Framework.Api:程序集名称-->
			
			<!--mapTo对应值-->
			<!--mapTo:类型映射的目标类型。如果这是映射注册,这就是映射的目标对象的类型。此属性是可选的。-->
			<!--Unity.IOC.Framework.Api.Models.Chinese:命名空间 + 类名-->
			<!--Unity.IOC.Framework.Api:程序集名称-->

			<!--name:在注册此类型时使用的名称。此属性是可选的,如果不指定此属性,所在的 add 元素即为默认的类型映射。-->
			<!--english:别名-->

			<!--lifetime:设置用于给定的类型和名称的生命周期。是一个来自 LifetimeStyle 枚举的值。有效的值是 Transient(默认),它导致了容器每次都创建一个新的实例;
			以及 Singleton,它使容器为每个请求返回同一实例。如果在配置一个单件时同时指定了 type 和 mapto 属性,SetSingleton 方法将返回指定在 mapTo 属性中的类型。
			如果 mapTo 属性没有指定值,SetSingleton 方法将返回指定在 type 属性中的类型。-->	
			
			<register type="Unity.IOC.Framework.Api.Models.ILanguage,Unity.IOC.Framework.Api" mapTo="Unity.IOC.Framework.Api.Models.Chinese,Unity.IOC.Framework.Api"/>
			<register type="Unity.IOC.Framework.Api.Models.ILanguage,Unity.IOC.Framework.Api" mapTo="Unity.IOC.Framework.Api.Models.English,Unity.IOC.Framework.Api" name="english">
				<lifetime type="transient"></lifetime>
				<!--<lifetime type="singleton"></lifetime>-->
				<!--<lifetime type="hierarchical"></lifetime>-->
				<!--<lifetime type="perresolve"></lifetime>-->
				<!--<lifetime type="perthread"></lifetime>-->
				<!--<lifetime type="ExternallyControlled"></lifetime>-->
			</register>
		</container>
	</unity>
	<!--unity配置 end-->

6、调用

ServiceLocator.Instance.GetService<ILanguage>().GetContent();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值