码迷,mamicode.com
首页 > 其他好文 > 详细

My.Ioc 代码示例——注册项 (Registration) 的注销和更新

时间:2014-09-10 12:21:30      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   ar   art   div   

当您需要从 Ioc 容器中注销/删除一个注册项的时候,您会怎么做呢?

有人曾经在 stackoverflow 上提问“如何从 Unity 中注销一个注册项”,对于这个问题,有人的回答是“有趣。你为什么要这样做?”,也有人提出了一些变通的解决办法,例如通过自定义 LifetimeManager 来实现等等。这些其实都不是根本的解决办法。因为服务的注册/注销本身是一个容器级过程,当中一定会涉及到一些中间对象的创建/清理 (Dispose) 以及不同对象之间的协调,本应由容器来提供支持才对。

遗憾的是,在目前常见的大多数 Ioc 容器中,几乎都不提供此项功能。就我目前所知,只有一个 Castle Windsor 曾经提供过 Unregister 功能,后来还在 3.0 版本中给去掉了,原因是这些方法 (Unregister) 有问题和瑕疵 (The methods were implementation of "remove component from the container" feature which was flawed and problematic, hecen was scraped)。

服务注销/删除功能的情况是如此,至于服务更新(在服务注销之后再注册新的服务以替换和更新原有服务)的功能,那就更不用说了。

难道服务不会过期作废 (Obsolete) 吗?难道服务一旦注册之后,真的不需要注销/更新吗?我觉得不是这样的。我能想到的场景至少有两个:插件环境(在插件环境中,随着插件的更新,有可能需要更新服务)和面向服务环境(在面向服务环境中,服务随时可能会启用/停用/更新)。

于是,我决定在自己的 My.Ioc 框架中提供注册项的注销/更新功能。用法很简单,可参见下面示例代码:

bubuko.com,布布扣
using System;
using System.Diagnostics;
using My.Ioc;

namespace ServiceUpdate
{
    #region Test Types

    public interface IService
    {
        string Name { get; }
    }

    public abstract class Service : IService
    {
        public string Name
        {
            get { return GetType().Name; }
        }
    }

    public class Service1 : Service
    {
    }

    public class Service2 : Service
    {
    }

    public interface IServiceConsumer
    {
        IService Service { get; }
    }

    public class ServiceConsumer : IServiceConsumer
    {
        readonly IService _service;

        public ServiceConsumer(IService service)
        {
            _service = service;
        }

        public IService Service
        {
            get { return _service; }
        }
    }

    #endregion

    class Program
    {
        static void Main(string[] args)
        {
            IObjectRegistration serviceRegistration;
            IObjectContainer container = new ObjectContainer(false);
            container.Register<IService, Service1>().Return(out serviceRegistration);
            container.Register<IServiceConsumer, ServiceConsumer>();
            container.CommitRegistrations();

            var consumer = container.Resolve<IServiceConsumer>();
            Debug.Assert(consumer != null);
            Debug.Assert(consumer.Service != null);
            Debug.Assert(consumer.Service.Name == "Service1");

            container.Unregister(serviceRegistration);
            container.Register<IService, Service2>().Return(out serviceRegistration);
            container.CommitRegistrations();

            consumer = container.Resolve<IServiceConsumer>();
            Debug.Assert(consumer != null);
            Debug.Assert(consumer.Service != null);
            Debug.Assert(consumer.Service.Name == "Service2");

            Console.ReadLine();
        }
    }
}
View Code

 

源码可在此处下载,压缩包中包含了 My.Ioc 框架的源码和本示例以及其他一些示例的源码。

 

My.Ioc 代码示例——注册项 (Registration) 的注销和更新

标签:style   blog   http   color   os   io   ar   art   div   

原文地址:http://www.cnblogs.com/johnny-liu/p/3962441.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!