2017-09-13 99 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