2017-09-13 22 views
1

我想在控制台应用程序中使用Autofac。这是我第一次使用。在此之前,我只在ASP.NET MVC中使用它。在MVC项目中,我可以在Global.asax中设置Autofac,向控制器注入IService,我们可以说它的工作量越来越少。 在控制台应用程序,我这样做如下:控制台应用程序中的Autofac(约定)

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>(); 
     } 
    } 
} 

它正如你所看到的用法是在短短的主要方法简单。如何在外部课堂上使用它?假设我想创建类Cat,并在其中使用Autofac。我应该通过类程序的构造器对象Container吗?例如:

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

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

什么是最佳解决方案?

回答

4

只有您的控制台应用程序确实需要了解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个或更多的其他类,它通过构造函数注入。由于AutoFac创建了IService及其所有依赖关系(包括ISomeDependency),因此所有ISomeDependency的依赖关系也将被初始化,并一直向下。展示这一概念的好视频是Miguel Castro的Deep Dive into Dependency Injection and Writing Decoupled Quality Code and Testable Software

+0

梅森,谢谢你的宝贵答案。我想从第一篇文章中提出我的问题。正如你写的,我们可以创建任何对象INSIDE主要方法。如果我想在其他课程中使用Autofac,该怎么办? 比方说,我有类 '公共类的EmployeeService { 公务员getEmployee的(十进制的id){ // 这里我想用一些其他的服务:使用AutoFac注入。 //我应该再次在这里创建容器对象,然后: //使用(var scope = Container.BeginLifetimeScope()){...} } } – cube

+0

@cube我不明白你在问什么现在。是的,你可以通过AutoFac创建一个对象的实例并通过构造器注入来注入东西。 – mason

+0

我对我的理解感到困惑。然而你回答我的怀疑。再次感谢你。 – cube