3

現在IoCのコンセプト(WPFアプリ)を使用していますが、私はまだ把握しようとしているので、私はそれを使用するツールをまだ決めていません私は、各コンポーネントの特定のパラメータに関してこれがどのように構成されるのか混乱しています。パラメータ付きIoCロガー

私は、設定ファイルに関連するライブラリをどのように定義するのか、どのライブラリをどのように使用するのか、およびそのライフスパンを決定する方法を理解しています。

どこから渡しますか?

たとえば、一般的なロガーを使用します。

Iは、次のインターフェイスがあります。私は、自分のパラメータを必要とする複数ロガーそれぞれを定義

public class Logger : ILogger 
{ 
    private readonly ILogger _logger; 

    public Logger (ILogger logger) 
    { 
     _logger = logger; 
    } 

    public void Write(string message) 
    { 
     _logger.Write(message); 
    } 
} 

、私は次のように実装:私はロガークラス自体を有する

public interface ILogger 
{ 
    void Write(string message); 
} 

a)データベースロガー:ここで私のメッセージをデータベースに記録できるように接続文字列が必要ですe。

public void LoggerDb: ILogger 
{ 
    public void Write(string message) 
    { 
    } 

    public ConnectionString {get; set;} 
} 

b)は、ファイルロガー:私は、関連するログファイルに私のメッセージをログに記録できるように、ファイル名が必要です

public void LoggerFile: ILogger 
{ 
    public void Write(string message) 
    { 

    } 

    public Filename {get; set;} 
} 

c)は、コンソールロガー:私はちょうど出力にコンソールウィンドウへの私のメッセージをしたいと何のパラメータが必要とされない。私のコンソールのテストアプリで

public void LoggerConsole: ILogger 
{ 
    public void Write(string message) 
    { 
    } 
} 

、私はProgram.csの中で、次のコードを持っている:Main方法で上記のコードについて、私と一緒に裸

static void Main(string[] args) 
{ 
    string logTypeId = "d"; 
    ILogger logType; 

    if (logTypeId == "d") 
    { 
     logType = new LoggerDb("Data Source=...."); 
    } 
    else if (logTypeId == "f" 
    { 
     logType = new LoggerFile("c:\\mylog.txt"); 
    } 
    else 
    { 
     logType = new LoggerConsole(); 
    } 

    Logger logger = new Logger(logType); 

    logger.Write("Message 1"); 
    logger.Write("Message 2"); 
    logger.Write("Message 3"); 
} 

してください。私はIoCツールを使用した場合のコードの仕方ではないことを理解しています。私はちょうど私が達成しようとしているものを強調するためにしようとしていると私は、次の質問への答えを取得しようとしている:

  1. が、これはIoCのツールを使用して達成することができるつまりロガーに応じて特定のパラメータを渡しますapp.configのIoCセクションで使用/定義されているタイプですか?

  2. 正しいアプローチですか?具体的なロガーには独自のコンストラクタパラメータがありますか?そうでない場合は、理由を説明し、正しい方法を教えてください。私はあなたが使用するIoCツールを気にしません。私はこれがどのように行われるべきか理解したい。

  3. これらの追加パラメータは、どこでapp.configに保存する必要がありますか?

ありがとう。

+0

"これはIoCツールを使用した場合のコードの仕組みではありません。"これは間違っています。 DIライブラリを使用していても、あなたがやっていることは有効なアプローチです。あなたの 'Main'メソッドは[Composition Root](http://blog.ploeh.dk/2011/07/28/CompositionRoot/)であり、DIライブラリを設定する場所です。 DIライブラリを使用する場合、コードはまったく同じに見えるかもしれません。 – Steven

答えて

2

まず、IoCを介してDIを実装するために、コンテナを設定ファイルに設定する必要はありません(確かにオプションであり、多くのコンテナでサポートされていますが)。

最近のほとんどのIoCコンテナでは、設定をコードで指定することもできます。だから、私は答えは:それは本当にあなたが使用する予定のIoCコンテナに依存していると思います。私の意見:可能であればXMLベースの設定を避けてください。あなたが私に尋ねるなら、それはしばしば維持する痛みであり、価値はほとんどありません。コードベースの設定では、app.configなどの設定パラメータを引き続き参照できます。

あなたは別のファイルでコンテナの設定をする必要がありますか(なぜですか)?はいの場合は、このウェルをサポートするコンテナを探します。しかし、ほとんどのことがあります。

コードベースのDSLを用いた構成のいくつかの例:

XML構成のいくつかの例:

+0

詳細な回答ありがとうございます。私はあなたのリンクを見ていきますが、xmlベースの設定ファイルの代わりに何を使うのでしょうか。また、コードベースの設定と言っても、 'Properties.Default.xxx'を使ってデータにアクセスするという意味ですか? – Thierry

+0

私の質問では1つのことを尋ねることを忘れました。たとえば、FileLoggerの場合、実行時にファイル名を変更する必要があるイベントのコンストラクタではなく、実行時に "Filename"プロパティを変更することができます。つまり、特定のプロセスに基づいてファイル名を作成します各プロセスは異なるファイル名の独自のログファイルを持ちますが、同じロガーを使用しますか?ありがとう。 – Thierry

+0

Autofacモジュールのドキュメントを読むことを強くお勧めします(例を確認してください)。あなたの質問については、それは本当に依存性注入とはほとんど関係がない設計問題です。 – jeroenh

0

;)

  1. 私は、すべての依存性の注入ツールのために話すことはできませんが、それらの多くは、この機能をサポートする必要があります。
  2. 私はこれに反対する何も見ません。異なるロガーを明示的に呼び出す場合は、これを行うことができます。しかし、何らかの種類のLogListenersを使用することもできます。 1つはDB、もう1つはFileなどです。そして、LoggerはすべてのLoggerにLogMessageを委任します。しかし、これはあなたが必要なものか必要なものかによって異なります;
  3. これは、Loggerの実装にもよります。 configにConnectionStringを格納するのは一般的です。他のパラメータはあまりにも限定されていますが、あなたもconfigに保存することができます。
+0

申し訳ありませんが私は明確ではなかったが、私は同時に別のロガーを呼びたくはありません。私はちょうど必要に応じて1つから他に切り替えることを許可したいです。 – Thierry

関連する問題