我已经在我的统一容器中注册了一个具体类,我想稍后注册一个接口,该接口可以连接到该类但使用现有的注册。统一注册:连接到预先注册的具体类的接口
我可以使用下面的代码做到这一点,但它会导致在注册时下决心......
container.RegisterInstance<IMyClass>(container.Resolve<MyClass>());
是否有可能在某点完成的所有决议,钩码起来的接口解决?
我已经在我的统一容器中注册了一个具体类,我想稍后注册一个接口,该接口可以连接到该类但使用现有的注册。统一注册:连接到预先注册的具体类的接口
我可以使用下面的代码做到这一点,但它会导致在注册时下决心......
container.RegisterInstance<IMyClass>(container.Resolve<MyClass>());
是否有可能在某点完成的所有决议,钩码起来的接口解决?
诀窍是使用InjectionFactory
:
container.Register<IMyClass>(
new InjectionFactory(c => c.Resolve<MyClass>()));
这听起来像你想创建一个工厂类型。在这里,一个Func
委托类型来避免新的自定义工厂类型的创建:
container.RegisterInstance<Func<IMyClass>>(() => container.Resolve<MyClass>());
你的其他类型的可再承担这个厂的依赖:
private IMyClass myClass;
public MyOtherType(Func<IMyClass> myClassFactory)
{
this.myClass = myClassFactory();
}
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");
}
这版画“等于”。这是我首先注册实例的方式。
在上面的评论中,您意味着您不控制初始注册。这是真正的问题。我会建议下去以下路径之一(按优先顺序,从最高到最低):
嘿,谢谢你的回应。不幸的是,这不是我需要的工厂类型。我有具有IMyClass接口作为构造函数参数的类。我希望这在使用类的时候解析到(已经注册的)MyClass,而不是在注册点。如果具体类没有预先注册并且我控制了注册,那么就不会有问题,因为我可以在IMyClass的RegisterType方法中为具体类编写注册码。 – Noob
也许我错过了一些东西,但是这种方法不行吗?即当你需要一个IMyClass的实例时,你可以调用工厂方法,该方法在调用时从容器中完成解析,并且将返回IMyClass在该点注册的任何实例? – devdigital
我不想强迫使用此界面的任何人使用Func。如果这不是一个限制,那么你的建议就会起作用。 :-) –
Noob