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

标签 c# .net dependency-injection console-application autofac

我想在控制台应用程序中使用 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/

相关文章:

c# - 在 C# 中,按最后一个元素对数组进行排序

c# - 从一个列表中获取与其他列表不匹配的唯一记录?

c# - 如何在可移植框架中设置 ServicePointManager.DefaultConnectionLimit

c# - 有没有更好的方法从另一个类(class)获取信息?

JAVA 6 服务加载器

c# - 使用tapi监控多个电话并拨号或挂断

.net - PHP var_dump 的 .NET 等价物是什么?

mvvm - ViewModel 到 ViewModel 的通信

ios - 依赖注入(inject)的公共(public)属性或自定义初始化程序?

c# - StreamWriter构造函数中的参数无效?