ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – Autofac注册并使用名称解析

2019-07-16 07:08:20  阅读:410  来源: 互联网

标签:c dependency-injection autofac


我正在尝试按名称注册对象,然后在注册期间将它们作为参数接受另一种类型的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>与他们所有人.

标签:c,dependency-injection,autofac
来源: https://codeday.me/bug/20190716/1475462.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有