gpt4 book ai didi

c# - Autofac 注册并解析名称

转载 作者:行者123 更新时间:2023-11-30 13:30:22 24 4
gpt4 key购买 nike

我正在尝试按名称注册对象,然后在注册期间将它们作为参数放入另一种类型的构造函数中。

希望我的示例足够清楚,这里是:

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");

稍后,在您的构造函数中,您可以注入(inject):

public Test(IIndex<string, IService> serviceDictionary)
{
var service1 = serviceDictionary["key1"];
}

我用了string对象作为键,但你可以引入例如枚举并将其用作 key 。

编辑:

如果您想缩小某些类(class)的可用服务范围,例如,您可以引入不同的枚举类型作为键。

enum ServicesA { A1, A2, A3 }
enum ServicesB { B1, B2 }

然后,注册:

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>(ServicesB.B2);

现在,如果你注入(inject) IIndex<SerivcesA, IService> , 只有 Service1 , Service2Service3将可用,用于 IIndex<SerivcesB, IService>它将是 Service4Service5 .

你可以链Keyed注册所以如果你从上面加入两个注册

builder.RegisterType<Service1>().Keyed<IService>(ServicesA.A1).Keyed<IService>("key1");` 

等等,你可以同时使用 IIndex<YourEnum, IService>只有一些 IService实现或 IIndex<string, IService>与他们一起。

关于c# - Autofac 注册并解析名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35975635/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com