我网上看文档,
解释如下:Unity 容器提供了RegisterInstance 方法,允许注册依赖注入映射 – 返回对单一已存在对象实例的引用。这一方法接收一个类型参数(对象接口或类型)和一个已存在的对象实例
下面的代码演示如何使用RegisterInstance 方法注册实现了IMyService接口的、已存在的对象实例。DataService myDataService = new DataService();
EmailService myEmailService = new EmailService();IUnityContainer myContainer = new UnityContainer(); myContainer.RegisterInstance<IMyService>(myDataService);
myContainer.RegisterInstance<IMyService>("Email", myEmailService);IMyService theDataService = myContainer.Resolve<IMyService>();
IMyService theEmailService = myContainer.Resolve<IMyService>("Email");
而RegisterInstance 返回对单一已存在对象实例的引用,而这个对象实例是指哪个呢?

解决方案 »

  1.   

    myContainer.RegisterInstance <IMyService>(myDataService); 
    myContainer.RegisterInstance <IMyService>("Email", myEmailService); 这两句是注册而非获取IMyService theDataService = myContainer.Resolve <IMyService>(); 
    //等同 IMyService theDataService=(IMyService) new myDataService();
    IMyService theEmailService = myContainer.Resolve <IMyService>("Email"); 
    这两句才是获取实际上这个基本等同于 基于hashTable的单件模式的应用,你google一下:基于hashTable的单件模式
    自然就清楚了
      

  2.   

    谢谢wanghui0380,我再想问问。照您说的那么theDataService 和theEmailService 的hashTable里的值就是一样了吗?而这个对象实例的引用就是指IMyService 了吗?
      

  3.   

    我们直接黑箱简单倒推他的代码实现 class myContainer
     { hashtable ht=new hashtable()
       void RegisterInstance <T>(T obj)
        {    ht.add(obj.getType().tostring(),obj);    } 
       
        void RegisterInstance <T>(string key ,T obj)
         {
       ht.add(key,obj);
         } 
           T  Resolve <T>(string key)
            {
                  return (T)ht[key];
            }     }ps:当然这是一个简单的推理实现,其内部有更完善的判定机制,unity本身是个开源的东西,想了解详细的请自己看的源代码
      

  4.   

    如果已经创建了一个对象,并希望使用已创建的对象作为单例
    那么应该使用RegisterInstance方法
    RegisterInstance 用于将一个已创建的对象实例注册成单件类型映射 
    RegisterInstance<T>(T instance)
    T t= new T();
    container.RegisterInstance<接口>(t);