4

C# アプリケーションの独自のログ サービスに既存のログ ライブラリをラップして、特定のログ状況用に定義済みのメソッドで囲みます。

public class LoggingBlockLoggingService : ILoggingService
{
    private LogWriter writer;

    public LoggingBlockLoggingService(LogWriter writer)
    {
        this.writer = writer;
    }
    ....//logging convenience methods, LogWarning(), etc...
}

この実装を変更して、インスタンス化するクラスの Type を受け取るようにしたいと思います (この場合、基になるロガー、LogWriter はシングルトンになります)。したがって、この実装 (およびインターフェイス ILoggingService) を一般的なものにします。

public class LoggingBlockLoggingService<T> : ILoggingService<T>
{
    ...
    private string typeName = typeof(T).FulName;
    ...

または、追加のコンストラクタ パラメータを追加します。

public class LoggingBlockLoggingService : ILoggingService
{
    private LogWriter writer;
    private string typeName;

    public LoggingBlockLoggingService(LogWriter writer, Type type)
    {
        this.writer = writer;
        this.typeName = type.FullName;
    }
    ....//Include the typeName in the logs so we know the class that is logging.
}

タイプを登録するときに Unity でこれを一度設定する方法はありますか? ログに記録したいすべてのクラスにエントリを追加する必要はありません。理想的には、誰かが私たちのプロジェクトのクラスにロギングを追加したい場合、彼らが取り組んでいる各クラスを登録するために Unity 構成に別の行を追加する代わりに、彼らが取り組んでいるクラスのコンストラクタに ILoggingService を追加するだけです。 .

XMLではなく、ランタイム/コード構成を使用しています

4

2 に答える 2

12

はい、使用できます:

container.RegisterType(typeof(IMyGenericInterface<>), typeof(MyConcreteGenericClass<>));

于 2013-04-04T15:07:29.513 に答える
0

あなたの場合、単純な直接的なジェネリック パラメーターからジェネリック パラメーターへのマッピングがある場合、Unity は実際にそれを処理する可能性がありますが、より高度なケースは処理されないと思います。ある時点で何かがマッピングを提供する必要があるためです。タイプ間のジェネリック パラメータ (Key-Value と Value-Key などの並べ替え)。

デイブの答えが十分でない場合は、Unity/ObjectBuilder にプラグインを作成して、新しい戦略または一連の戦略を登録し、アセンブリの自動スキャンやマテリアライゼーションなど、必要なタイプ マッピングだけをカバーできると確信しています。ジェネリック。

http://www.orbifold.net/default/unity-objectbuilder-part-ii/の一連の記事と、その近くのセクションを参照してください。

Context.Strategies.AddNew< buildkeymappingstrategy >(UnityBuildStage.TypeMapping);
于 2013-04-04T15:11:24.217 に答える