gpt4 book ai didi

c# - 控制台应用程序中的 Autofac(约定)

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

我想在控制台应用程序中使用 Autofac。这是我真正的第一次使用。在此之前,我只在 ASP.NET MVC 中使用它。在 MVC 项目中,我可以在 Global.asax 中设置 Autofac,将 IService 注入(inject) Controller ,我们可以说它越来越有效。在控制台应用程序中,我这样做如下:

internal class Program
{
private static IContainer Container { get; set;}

private static void Main(string[] args)
{
Container = Container.Configure(); // here I have all necessary objects set
// now I can use it in Main method as:
using (var scope = Container.BeginLifetimeScope())
{
scope.Resolve<ISomething>();
}
}
}

如您所见,它的用法很简单,仅在 Main 方法中。在外部类中使用它怎么样?假设我想创建 Cat 类,并在其中使用 Autofac。我应该从类程序传递给构造函数对象容器吗?例如:

Cat cat = new Cat(Program.Container, "Molly");

或者也许我应该在 Cat 类中创建 IContainer?

什么是最好的解决方案?

最佳答案

只有您的控制台应用程序真正需要了解 AutoFac,否则您将落入服务定位器模式,这通常被认为是一种反模式。相反,您的应用程序应遵循以下模式:

//in your console application
using (var scope = Container.BeginLifetimeScope())
{
IServiceservice = scope.Resolve<IService>();
service.Execute();
}

class SomeService : IService
{
readonly ISomeDependency _dependency;

public SomeService(ISomeDependency dependency)
{
_dependency = dependency;
}

public void Execute()
{
_dependency.DoSomething();
}
}

interface IService
{
void Execute();
}

请注意,我实际上从未调用过构造函数。我养成了从不“更新”对象的习惯,除非该对象只是一个 POCO(仅包含数据,不包含逻辑)。

请注意,ISomeDependency 本身可以依赖于 0 个或多个其他类,它通过构造函数注入(inject)获取这些类。由于 AutoFac 创建了 IService 及其所有依赖项,包括 ISomeDependency,所有 ISomeDependency 的依赖项也将被初始化,等等一直往下。 Miguel Castro 的 Deep Dive into Dependency Injection and Writing Decoupled Quality Code and Testable Software 是一个很好的演示这个概念的视频。 .

关于c# - 控制台应用程序中的 Autofac(约定),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46204918/

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