Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Autofac:注册相互关联的服务,并使用名称/键/元/索引进行解析_C#_Autofac - Fatal编程技术网

C# Autofac:注册相互关联的服务,并使用名称/键/元/索引进行解析

C# Autofac:注册相互关联的服务,并使用名称/键/元/索引进行解析,c#,autofac,C#,Autofac,我在autofac注册时遇到过这样的情况,即服务相互关联。以下是我现在拥有的: var builder = new ContainerBuilder(); const string A = "A"; const string B = "B"; //Part 1 builder.RegisterType<ClassA1>().Named<IClass1>(A); builder.RegisterType<ClassA2>().Named<IClass2

我在autofac注册时遇到过这样的情况,即服务相互关联。以下是我现在拥有的:

var builder = new ContainerBuilder();

const string A = "A";
const string B = "B";

//Part 1
builder.RegisterType<ClassA1>().Named<IClass1>(A);
builder.RegisterType<ClassA2>().Named<IClass2>(A);

builder.RegisterType<ClassB1>().Named<IClass1>(B);
builder.RegisterType<ClassB2>().Named<IClass2>(B);

//Part 2
builder.Register(c => new ClassProcess(A, c.ResolveNamed<IClass1>(A), c.ResolveNamed<IClass2>(A))).Named<ClassProcess>(A).SingleInstance();
builder.Register(c => new ClassProcess(B, c.ResolveNamed<IClass1>(B), c.ResolveNamed<IClass2>(B))).Named<ClassProcess>(B).SingleInstance();

//Part 3
builder.Register(c => new ClassProcessDependency(c.ResolveNamed<ClassProcess>(B), c.ResolveNamed<ClassProcess>(A)));
var builder=newcontainerbuilder();
常量字符串A=“A”;
常量字符串B=“B”;
//第一部分
builder.RegisterType()。命名为(A);
builder.RegisterType()。命名为(A);
builder.RegisterType()。命名为(B);
builder.RegisterType()。命名为(B);
//第二部分
Register(c=>newclassprocess(A,c.ResolveNamed(A),c.ResolveNamed(A))).Named(A.SingleInstance();
Register(c=>newclassprocess(B,c.ResolveNamed(B),c.ResolveNamed(B))).Named(B.SingleInstance();
//第三部分
Register(c=>newClassProcessDependency(c.ResolveNamed(B),c.ResolveNamed(A));
在第1部分中,我定义了成对连接的两个基本类,IClass1和IClass2

在第2部分中,我定义了一个连接这两个类的“流程”。这个过程实际上是传递给程序其余部分的,它需要一个IEnumerable

在第3部分中,我定义了这些流程之间存在的任何依赖关系,以便它们以正确的顺序执行

我在这里寻找的是Autofac中的一些register方法,它可以使用以前使用name/key/meta注册的服务,并使用这些数据注册新的服务


编辑:请注意,我正在尝试找出是否有任何特定于Autofac的方法来执行此操作。

假设您的列表中有常量,您可以通过

IEnumerable<string> constants
如果你不能像那样循环,那么你的自动化方法可能会受到限制。或者,至少,你会看到更多。。。复杂的

ContainerBuilder
实际上不允许在注册时直接访问已注册项集,因此您必须进行一些低级的欺骗。您可能可以实现一个
IRegistrationSource
,以定位特定类型的所有命名注册并进行自动化

不幸的是,正如前面提到的,这个过程有点复杂,所以我不打算写出一个完整的解决方案。我将告诉您我认为基本上可行的方法,并为您提供一些参考资料,以便在源代码中查找示例

在开始这条路之前,将解释如何编写其中一个,并使用其中一个内置Autofac源作为示例

首先,您需要实现一个
Autofac.Core.IRegistrationSource
这是一个用于添加隐式集合支持等操作的接口(因此,如果您注册五个
IFoo
实例,您可以解析
IEnumerable
,并且它可以工作)。您可以查看核心Autofac程序集中Autofac代码中的注册源示例:

注册源中的主要功能是
RegistrationsFor
方法,该方法返回源生成的注册列表:

IEnumerable<IComponentRegistration> RegistrationsFor(
  Service service,
  Func<Service, IEnumerable<IComponentRegistration>> registrationAccessor);
同样,如果您有兴趣了解这一点,我会在Autofac树中查看这些源文件。由于其复杂性,这条路不是很多人走的


老实说如果您可以循环遍历这些常量,我会这样做。为了避免foreach循环,这似乎需要做很多工作。

谢谢你的建议。你是对的,循环遍历常量是一种解决方案。然而,我所希望的是一种Autofac方式来实现这一点,它可以一次性注册所有已注册的服务,并使用该名称。很抱歉,我的问题不够具体,我将更新我的问题。我更新了我的答案,以包含有关自动化的“Autofac方式”的信息,但这并不容易。如果你同时在寻找“简易”和“自动”,我不确定你是否能得到你想要的答案。谢谢,这是一个很好的答案,我以前读过,我只是忘了将其标记为已接受,对不起!
public class ProcessModule : Autofac.Module
{
  private IEnumerable<string> _constants;
  public ProcessModule(IEnumerable<string> constants)
  {
    this._constants = constants;
  }

  protected override void Load(ContainerBuilder builder)
  {
    // Put the foreach here and loop over this._constants.
  }
}
builder.RegisterModule(new ProcessModule(constants));
IEnumerable<IComponentRegistration> RegistrationsFor(
  Service service,
  Func<Service, IEnumerable<IComponentRegistration>> registrationAccessor);
builder.RegisterSource(new MyRegistrationSource());