2016-08-22 69 views
0

我想展開Autofac的快速入門示例。我想要做的是不寫入我想寫入文件的控制檯。我創建了一個實現IOutput的新類,它正確寫入文件。Autofac多個實現

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

聽起來好像你需要將IOutput接口分成兩個不同的接口(IFileOutput,IConsoleOutput),然後使用你想要的接口。

另一種方法是注入一個IEnumerable<IOutput>,它會給你兩個IOutput的實現,然後你可以寫入兩者,如果這是可取的。

+0

因此,我認爲我在文檔中弄亂了這一點。但是,我需要兩個TodayWriter的實現嗎?一個需要一個IFileOutput,另一個需要IConsoleOutput?然後用那些我想要的東西? –

+0

這真的取決於,我不確定你的意思是有時想寫入一個輸出,有時想寫另一個輸出,你能提供更多的細節嗎? 如果您想要在同一個類的不同時間寫入控制檯或文件輸出,那麼您可以將其分成兩個界面,如果您有時想總是*寫入兩個輸出之一,那麼您可以有條件地註冊當你建立你的容器時的輸出 – ivanPfeff

+0

我想我正在努力的是如何改變TodayWriter上的參數注入從文件到控制檯。我從來沒有直接調用控制檯輸出,但我通過TodayWriter調用它。 –