11

次のようなコンストラクターを持つクラスがあります。

public BatchService(IRepository repository, ILogger logger, string user)

私のDIブートストラッパークラスには、次のRegisterTypeコマンドがあります。

.RegisterType<BatchService>(
    new InjectionConstructor(
        new ResolvedParameter<IRepository>("SomeRepository"), 
        new ResolvedParameter<ILogger>("DatabaseLogger")))

私のクライアントコードでは、BatchService次のようにインスタンス化したいと思います。

BatchService batchService = DIContainer.Resolve<BatchService>()

ご覧のとおり、DIロジックの一部ではないuserコンストラクターの一部として呼び出される文字列パラメーターがあります。クラスで使用するBatchService必要がある場合、この状況にどのように対処するのが最善ですか?userBatchService

4

3 に答える 3

7

使用できますParameterOverride

BatchService batchService = 
DIContainer.Resolve<BatchService>(new ParameterOverride("user", valueForUser));
于 2012-08-16T20:54:57.913 に答える
7

Unity を ServiceLocator として悪用しないでください。

ランタイム パラメータを必要とするオブジェクトを作成する場合は、ファクトリを使用します。Typed Factoryの Unity バージョンを使用するか、Unity にファクトリー デリゲートを生成させることで、そのファクトリーを実装する行為をやめることさえできます。

于 2012-08-16T20:59:45.150 に答える
-1

ILoggerまず第一に、ビジネス ロジックと混同するのは得策ではありません。ILogger を直接作成するBatchServiceか、属性を介して解決でき[Dependency]ます。DI は万能薬ではありません。ビジネス オブジェクトの作成は依存すべきではありません。ILogger

詳細については、注入されたパラメーターとプロパティ値の登録new InjectionParameter<string>("user")をご覧ください。

于 2012-08-16T21:22:34.220 に答える