2016-08-22 2 views
0

Autofac의 빠른 시작 예제를 확장하고 싶습니다. 내가하고 싶은 것은 파일에 쓰고 싶은 콘솔에 쓰는 대신에하는 것입니다. 나는 IOutput을 구현하는 새로운 클래스를 만들었고 파일에 올바르게 씁니다.여러 팩터에서 자동 실행

public class FileOutput : IOutput 
{ 
    //public string FilePath { get; set; } 

    public void Write(string content) 
    { 
     using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"AutoFacLog.txt", true)) 
     { 
      file.WriteLine(content); 
     } 
    } 
} 

private static IContainer Container { get; set; } 
     static void Main(string[] args) 
     { 
      var builder = new ContainerBuilder(); 
      builder.RegisterType<ConsoleOutput>().As<IOutput>(); 
      builder.RegisterType<TodayWriter>().As<IDateWriter>(); 
      Container = builder.Build(); 

      WriteDate(); 
     } 

     public static void WriteDate() 
     { 
      using (var scope = Container.BeginLifetimeScope()) 
      { 
       var writer = scope.Resolve<IDateWriter>(); 
       writer.WriteDate(); 
      } 
     } 
public class TodayWriter : IDateWriter 
{ 
    private IOutput _output; 
    public TodayWriter(IOutput output) 
    { 
     this._output = output; 
    } 

    public void WriteDate() 
    { 
     this._output.Write(DateTime.Today.ToShortDateString()); 
    } 
} 

그러나 예제 프로그램에서이 프로그램을 직접 호출하지는 않습니다. TodayWriter는 내 IOutput 구현을 호출합니다. 콘솔로 출력하고자하는 하나의 호출과 파일에 쓰고 싶은 다른 호출의 경우 어떻게 다시 전환 할 수 있습니까?

답변

0

두 개의 서로 다른 인터페이스 (IFileOutput, IConsoleOutput)로 IOutput 인터페이스를 분리하고 원하는 곳에서 사용할 필요가있는 것 같습니다.

또 다른 옵션으로는 IEnumerable<IOutput>을 삽입하면 IOutput의 구현을 모두 제공 할 수 있습니다. 그러면 두 가지 모두에 쓸 수 있습니다.

+0

그래서 저는 문서에서 그 말을 듣고 싶습니다. 그러나 TodayWriter를 두 번 구현해야합니까? 하나는 IFileOutput을 취하고 다른 하나는 IConsoleOutput을 취합니다. 내가 원하는 곳에서 사용하는거야? –

+0

정말 달라집니다. 한 출력에 쓰기를 원할 때가 있고 때로는 다른 것에 쓰기를 원할 때 어떤 의미인지 잘 모르겠습니다. 자세한 내용을 제공 할 수 있습니까? 같은 클래스의 다른 시간에 콘솔이나 파일 출력에 쓰기를 원한다면, 두 개의 인터페이스 중 하나로 나눌 수 있습니다. 때때로 두 출력 중 하나에 쓰기를 원할 경우, 조건부로 등록 할 수 있습니다 당신이 컨테이너를 만들 때의 출력 – ivanPfeff

+0

내가 고민하고있는 것은 TodayWriter의 매개 변수 주입을 파일에서 콘솔로 변경하는 방법입니다. 콘솔 출력을 실제로 직접 호출하지는 않지만 TodayWriter를 통해 콘솔 출력을 호출합니다. –