我想在控制台应用程序中使用 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。我应该从类 Program 传递给构造函数对象 Container 吗?例如:
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/