2017-09-13 1 views
1

콘솔 응용 프로그램에서 Autofac을 사용하고 싶습니다. 그것은 내 첫 사용법입니다. 그 전에 ASP.NET MVC에서만 사용하고있었습니다. MVC 프로젝트에서 Global.asax에서 Autofac을 설정하고 컨트롤러에 IService를 삽입하면 작동이 더 많고 적을 수 있습니다. 콘솔 응용 프로그램에서 나는 아래처럼 수행 그것의콘솔 응용 프로그램의 자동 열기

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을 사용한다고 가정합시다. 클래스 프로그램의 컨스트럭터 객체 컨테이너에 전달해야합니까? 예 :

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

메이슨, 귀중한 답변에 감사드립니다. 나는 첫 번째 게시물에서 내 문제를 연장하고 싶습니다. 여러분이 썼을 때 main 메소드 내부에 어떤 객체를 생성 할 수 있습니다. 어떤 경우에 다른 클래스에서 Autofac을 사용하고 싶습니까? 의 내가 있다고 가정 해 봅시다 클래스 ' { 공무원 GetEmployee라는 (소수점 ID가) 나는 다른 서비스를 사용하고자하는 { // 여기에 EmployeeService 공용 클래스 : AutoFac를 사용하여 주입. // 여기에 다시 컨테이너 객체를 만들고 다음을 수행해야합니다. // (var scope = Container.BeginLifetimeScope()) {...} } }' – cube

+0

@ 큐브 당신이 묻는 것을 이해하지 못합니다. 지금. 예, AutoFac을 통해 객체의 인스턴스를 생성하고 생성자 주입을 통해 객체를 주입 할 수 있습니다. – mason

+0

나는 내 주장과 혼동스러워. 그러나 당신은 나의 의심에 대답했다. 다시 감사합니다. – cube

관련 문제