2011-10-20 68 views
0

我已经在我的统一容器中注册了一个具体类,我想稍后注册一个接口,该接口可以连接到该类但使用现有的注册。统一注册:连接到预先注册的具体类的接口

我可以使用下面的代码做到这一点,但它会导致在注册时下决心......

container.RegisterInstance<IMyClass>(container.Resolve<MyClass>()); 

是否有可能在某点完成的所有决议,钩码起来的接口解决?

回答

2

诀窍是使用InjectionFactory

container.Register<IMyClass>(
    new InjectionFactory(c => c.Resolve<MyClass>())); 
0

这听起来像你想创建一个工厂类型。在这里,一个Func委托类型来避免新的自定义工厂类型的创建:

container.RegisterInstance<Func<IMyClass>>(() => container.Resolve<MyClass>()); 

你的其他类型的可再承担这个厂的依赖:

private IMyClass myClass; 

public MyOtherType(Func<IMyClass> myClassFactory) 
{ 
    this.myClass = myClassFactory(); 
} 
+0

嘿,谢谢你的回应。不幸的是,这不是我需要的工厂类型。我有具有IMyClass接口作为构造函数参数的类。我希望这在使用类的时候解析到(已经注册的)MyClass,而不是在注册点。如果具体类没有预先注册并且我控制了注册,那么就不会有问题,因为我可以在IMyClass的RegisterType方法中为具体类编写注册码。 – Noob

+0

也许我错过了一些东西,但是这种方法不行吗?即当你需要一个IMyClass的实例时,你可以调用工厂方法,该方法在调用时从容器中完成解析,并且将返回IMyClass在该点注册的任何实例? – devdigital

+0

我不想强迫使用此界面的任何人使用Func 。如果这不是一个限制,那么你的建议就会起作用。 :-) – Noob

0
IUnityContainer container = new UnityContainer(); 

var onlyInstance = new MyClass(); 
container.RegisterInstance<IMyClass>(onlyInstance); 

IMyClass resolved = container.Resolve<IMyClass>(); 

if (object.ReferenceEquals(onlyInstance, resolved)) 
{ 
    Console.WriteLine("Equal"); 
} 

这版画“等于”。这是我首先注册实例的方式。

在上面的评论中,您意味着您不控制初始注册。这是真正的问题。我会建议下去以下路径之一(按优先顺序,从最高到最低):

  • 创建你自己的UnityContainer独立的预注册一个
  • 与CreateChildContainer
  • 创建一个子容器使用已命名的(非默认)映射