Prism学习历程四、Container和Services

Prism的依赖注入支持Unity,但不仅限于Unity,Prism通过IServiceLocator来构造对象,定义如下

IServiceLocatorpublic interface IServiceLocator : IServiceProvider
{
    object GetInstance(Type serviceType);
    object GetInstance(Type serviceType, string key);
    IEnumerable<object> GetAllInstances(Type serviceType);
    TService GetInstance<TService>();
    TService GetInstance<TService>(string key);
    IEnumerable<TService> GetAllInstances<TService>();
}

还有一个IServiceLocator的扩展类

ServiceLocatorExtensions    public static class ServiceLocatorExtensions
    {
        public static object TryResolve(this IServiceLocator locator, Type type)
        {
            try
            {
                return locator.GetInstance(type);
            }
            catch (ActivationException)
            {
                return null;
            }
        }

        public static T TryResolve<T>(this IServiceLocator locator) where T: class
        {
            return locator.TryResolve(typeof(T)) as T;
        }
    }

 

默认为我们提供了,UnityServiceLocatorAdaper,看名字就知道它是一个适配器,用来连接Unity和IServiceLocator,

UnityServiceLocatorAdapterpublic class UnityServiceLocatorAdapter : ServiceLocatorImplBase
{
    private readonly IUnityContainer _unityContainer;

    public UnityServiceLocatorAdapter(IUnityContainer unityContainer)
    {
        _unityContainer = unityContainer;
    }

    protected override object DoGetInstance(Type serviceType, string key)
    {
        return _unityContainer.Resolve(serviceType, key);
    }

    protected override IEnumerable<object> DoGetAllInstances(Type serviceType)
    {
        return _unityContainer.ResolveAll(serviceType);
    }
}


UnityServiceLocatorAdapter的定义出人意料的简单,仅仅二个方法,它继承自Microsoft.Practices.ServiceLocation.dll里的ServiceLocatorImplBase,

image

这个类的定义也是非常简单,里面的代码仅仅是将对方法的调用委托给DoGetInstance和DoGetAllInstances这二个虚方法,代码很精简,在UnityBootstraper里通过UnityContainer来获取UnityServiceLocatorAdaper,再由UnityServiceLocatorAdaper取得各种服务。在UnityBootstrapper里通过调用

RegisterTypeIfMissing(typeof(IServiceLocator), typeof(UnityServiceLocatorAdapter), true);

接下来我们就可以能过serviceLocator来使用Unity提供的依赖注入功能。

如果我们要护展使用第三方的依赖注入容器,就可以通过继承ServiceLocatorImplBase,重写他拉两个虚方法,然后实现我们自定义的Bootstrapper,下面是MefServiceLocatorAdaper的实现代码

UnityServiceLocatorAdapter   public class MefServiceLocatorAdapter : ServiceLocatorImplBase
    {
        private readonly CompositionContainer compositionContainer;
        public MefServiceLocatorAdapter(CompositionContainer compositionContainer)
        {
            this.compositionContainer = compositionContainer;
        }
        protected override IEnumerable<object> DoGetAllInstances(Type serviceType)
        {
            List<object> instances = new List<object>();

            IEnumerable<Lazy<object, object>> exports = this.compositionContainer.GetExports(serviceType, null, null);
            if (exports != null)
            {
                instances.AddRange(exports.Select(export => export.Value));
            }

            return instances;
        }

      protected override object DoGetInstance(Type serviceType, string key)
        {
            IEnumerable<Lazy<object, object>> exports = this.compositionContainer.GetExports(serviceType, null, key);
            if ((exports != null) && (exports.Count() > 0))
            {
                return exports.Single().Value;
            }

            throw new ActivationException(
                this.FormatActivationExceptionMessage(new CompositionException("Export not found"), serviceType, key));
        }
    }

 

是不是也很简单呀

转载于:https://www.cnblogs.com/wormli/archive/2010/08/10/1796836.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值