2

構造マップに IContainer を実装する方法に関する以前の投稿に続いて、しばらくの間、私の最後の問題だと思っていた問題にぶつかりました。

追加の (Structuremap が注入されていない) オブジェクトをコンストラクターに渡すにはどうすればよいですか?

これをテストするために私が持っているサンプル コンソール アプリケーションから以下を取り上げます。

static void Main(string[] args)
{
     _container = StructureMapConfig.GetContainer();
     _userService = _container.GetInstance<IUserService>();
}

私のコンストラクターには randomParam があり、構造マップにはギャップを埋める方法がわからないため、これにより次のエラーがスローされます。

タイプ 'StructureMap.StructureMapBuildPlanException' の未処理の例外が StructureMap.dll で発生しました

追加情報:具象型 CommonServices.UserService のビルド プランを作成できません

コンストラクタ:

public UserService(IUserRepository userRepository, IStringService stringService, string randomParam)
{
    _userRepository = userRepository;
    _stringService = stringService;
}

私のレジストリでは、次のようにユーザー サービスを定義します。

 this.For<IUserService>().Use<UserService>();

私が持っている質問は、これを最も簡単な方法で行うにはどうすればよいですか?

このリンクを見つけましたが、呼び出し元のクラスに UserService の依存関係を認識させる必要があるため、提案の使用方法がわかりません。ご覧のとおり、それらの一部はデータ レイヤー アイテムであり、UI レイヤーにそれらについて伝えたくありません。

http://structuremap.github.io/resolving/passing-arguments-at-runtime/

4

1 に答える 1

10

次のようにパラメーターをターゲットにできるはずです。

this.For<IUserService>().Use<UserService>().Ctor<string>("randomParam").Is("YourValue");

これは機能しますが、注入するパラメーターがあらゆる種類のビジネスロジック、構成に関連付けられている場合、またはその値が特定の条件に基づいている場合でも、プロキシとして機能するビルダークラスを作成することをお勧めします (同様のこの回答に)、文字列の値を決定するロジックをカプセル化し、代わりにそれを注入します。

このような文字列を挿入するときは、ビジネス ロジックを間違った場所に配置しないように注意する必要があります。

于 2015-01-23T09:08:02.513 に答える