1

少し混乱するUnityを使用するシナリオがあります...ユーザーを認証するAuthenticationServiceがあり、TextLoggerクラスまたはDbLoggerクラスをそれぞれ使用してテキストファイルまたはデータベースに正常にログを記録するとします。通常、プロジェクトで使用するクラスについては、以下のようにモジュール クラスに適切に登録します。

public class LoggingModule
{
    IUnityContainer _iocContainer;

    public LoggingModule(IUnityContainer container)
    {
        _iocContainer = container;
    }

    public void Init()
    {
        //Add any logic here to look in a config file, check a property
        //or any other condition to decide which implementation is registered.

        //register the database logger to the ILogger interface
        _iocContainer.RegisterType(typeof(ILogger), typeof(DBLogger));

    }
}

そして、これは認証サービスのコンストラクターに挿入されます。しかし、アプリケーションの異なるポイントで両方のロガーを使用したい場合、最初に Init メソッドで両方のタイプ、つまり TextLogger と DBLogger を登録しますか? 第二に、コンテナは解決するタイプをどのように認識しますか?

助けてください....

4

2 に答える 2

3

両方のタイプを名前を付けてコンテナーに登録します。

container.RegisterType<ILogger, DBLogger>("DBLogger");
container.RegisterType<ILogger, TextLogger>("TextLogger");

name パラメータを使用して型を解決します。

var logger = container.Resolve<ILogger>("DBLogger");
于 2013-01-09T07:23:42.987 に答える
0

ネストされたコンテナーを使用して自分自身を呼び出していない限りResolve、Unity はシナリオ主導の解決ではなく、アプリケーション全体の解決を提供します。

ネストされた Unity コンテナーを使用して目的を達成できますが、特に、ネストされたコンテナーのアプローチは、アプリケーション全体の解決に関して「規則の例外」に対処するためのものであるため、独自のコードで解決を行う方がよいでしょう。

各インスタンスに適した具象型を判断するには、コード ブロックが必要です。このコードは、依存インスタンスに適切な具象型を注入する上位レベルの制御/オーケストレーション クラスにプッシュすることができます。

于 2013-01-09T07:10:53.563 に答える