C# Autofac如何帮助您在现有类中同时注入类/接口的多个实例
我对Autofac非常陌生,仍然不了解所有的潜力。 让我们以网站文档中的quick autofac教程中考虑的示例为例 Autofac胶水如下所示:C# Autofac如何帮助您在现有类中同时注入类/接口的多个实例,c#,autofac,ioc-container,C#,Autofac,Ioc Container,我对Autofac非常陌生,仍然不了解所有的潜力。 让我们以网站文档中的quick autofac教程中考虑的示例为例 Autofac胶水如下所示: using System; using Autofac; namespace DemoApp { public class Program { private static IContainer Container { get; set; } static void Main(string[] args) {
using System;
using Autofac;
namespace DemoApp
{
public class Program
{
private static IContainer Container { get; set; }
static void Main(string[] args)
{
var builder = new ContainerBuilder();
builder.RegisterType<ConsoleOutput>().As<IOutput>();
builder.RegisterType<TodayWriter>().As<IDateWriter>();
Container = builder.Build();
WriteDate();
}
}
}
public static void WriteDate()
{
// Create the scope, resolve your IDateWriter,
// use it, then dispose of the scope.
using (var scope = Container.BeginLifetimeScope())
{
var writer = scope.Resolve<IDateWriter>();
writer.WriteDate();
}
}
public class LogsOutput : IOutput
{
public void Write(string content)
{
// write content to a log file here
}
}
这是一个纯粹的例子。我想把这个例子扩展到一个更大的问题。
现在,Autofac胶水代码应该是什么样子?为了让代码同时执行ConsoleOutput类和LogsOutput类,并将输出打印到控制台和日志文件
是否可以通过Autofac实现这一点,或者这不是Autofac的行为?
我可能希望能够添加数百个类,所有这些类都使用IOutput接口。如何使用Autofac实现这一点?创建新的输出类型后
首先,您需要在容器中注册它,使用:
注意:如果您不使用字符串名称,可以使用哪个用于枚举。AutoFac通过依赖IEnumerable直接支持这一点。当它看到IEnumerable时,它将返回满足接口T的所有注册类型的集合 在您的情况下,将LogsOutput和ConsoleOutput注册为IOutput,并解析IEnumerable,以获得两个已注册的服务 可以找到更多细节 可枚举类型的依赖项提供了 相同的服务接口。这在诸如message之类的情况下很有用 处理程序,其中传入一条消息,并调用多个处理程序 已注册以处理该消息
你应该看看或者。让我知道,如果你喜欢以你的案例为基础的例子,为什么投反对票?也许这个问题应该修改一下?非常感谢。我看了两遍。var作家。可能是打字错误?是的,我更新了答案,我想告诉你如何在这两种情况下实例化作者。
public class LogsOutput : IOutput
{
public void Write(string content)
{
// write content to a log file here
}
}
var builder = new ContainerBuilder();
builder.RegisterType<ConsoleOutput>().Named<IOutput>("console");
builder.RegisterType<LogsOutput>().Named<IOutput>("logs");
builder.RegisterType<TodayWriter>().As<IDateWriter>();
Container = builder.Build();
public static void WriteDate()
{
// Create the scope, resolve your IDateWriter,
// use it, then dispose of the scope.
using (var scope = Container.BeginLifetimeScope())
{
var writer = scope.ResolveNamed<IDateWriter>("console"); // for console output
//var writer = scope.ResolveNamed<IDateWriter>("logs"); // for logs output
writer.WriteDate();
}
}