c# – Autofac注册并使用名称解析
发布时间:2020-12-15 23:47:48 所属栏目:百科 来源:网络整理
导读:我正在尝试按名称注册对象,然后在注册期间将它们作为参数接受另一种类型的ctor. 希望我的例子足够清楚,这里是: public class Obj : IObj{ public class Obj(string name)}I register the following objects like this :public void RegisterMyObj(string na
我正在尝试按名称注册对象,然后在注册期间将它们作为参数接受另一种类型的ctor.
希望我的例子足够清楚,这里是: public class Obj : IObj { public class Obj(string name) } I register the following objects like this : public void RegisterMyObj(string name) { // Keyed with the object name builder.Register<Obj>().Named<IObj>(name).WithParameter(name).SingleInstance(); } public class ObjectsHolder : IObjectsHolder { public ObjectsHolder (List<IObj> objsToHold)) } // I want to register my ObjectsHolder in the following way: for example,this is how I want to call it from my code: RegisterObjectsHolder(string Obj1Name,string Obj2Name) public void RegisterObjectsHolder(params string[] objectsNames) { builder.Register<IObjectsHolder>().WithParameters(// Here comes the magic code which I can't figure out. // I want objects holder to be registered with the Obj instances whose names were passed to this method,// is there a way to do this?) ) } 我对注册的方式并不严格.如果你知道使用不同方法实现这一目标的方法,那也可以. 提前致谢! 解决方法
您可能希望使用“键控”服务,而不是将您的服务注册为“已命名”.无法通过名称指定服务.但你可以使用IIndex< TKey,TService>检索具有指定类型的键控服务的类字典对象.所以你可以注册:
builder.RegisterType<Service1>().Keyed<IService>("key1"); builder.RegisterType<Service2>().Keyed<IService>("key2"); builder.RegisterType<Service3>().Keyed<IService>("key3"); builder.RegisterType<Service4>().Keyed<IService>("key4"); builder.RegisterType<Service5>().Keyed<IService>("key5"); 稍后,在您的构造函数中,您可以注入: public Test(IIndex<string,IService> serviceDictionary) { var service1 = serviceDictionary["key1"]; } 我使用字符串对象作为键,但你可以引入例如枚举并将其用作关键. 编辑: 如果您想缩小某些课程的可用服务范围,您可以例如引入不同的枚举类型作为键. enum ServicesA { A1,A2,A3 } enum ServicesB { B1,B2 } 然后,registratrions: builder.RegisterType<Service1>().Keyed<IService>(ServicesA.A1); builder.RegisterType<Service2>().Keyed<IService>(ServicesA.A2); builder.RegisterType<Service3>().Keyed<IService>(ServicesA.A3); builder.RegisterType<Service4>().Keyed<IService>(ServicesB.B1); builder.RegisterType<Service5>().Keyed<IService>(ServicesA.B2); 现在,如果你注入IIndex< SerivcesA,IService>,只有Service1,Service2和Service3可用,对于IIndex< SerivcesB,IService>它将是Service4和Service5. 您可以链接密钥注册,如果您从上面加入两个注册 builder.RegisterType<Service1>().Keyed<IService>(ServicesA.A1).Keyed<IService>("key1");` 等,你可以使用IIndex< YourEnum,IService>仅使用一些IService实现或IIndex< string,IService>与他们所有人. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |