2011-01-10 16 views
0

実行時にマッピングを削除することはできますか?私は簡単に十分なものを追加することができます。実行時にStructureMapからデフォルトのインスタンスタイプを削除する

ObjectFactory.Configure(ce => 
     ce.ForRequestedType<IDateAdjuster>(). 
      TheDefaultIsConcreteType<DateAdjusterForTest>()); 

と私はマッピングが

ObjectFactory.Model.HasDefaultImplementationFor<IDateAdjuster>() 

に存在するかどうかを確認することができますが、私はデフォルトのインスタンスタイプを削除するように見えることはできません。私はこれを試みた

var config = ObjectFactory.Model.PluginTypes 
      .FirstOrDefault(pt => pt.PluginType == typeof(IDateAdjuster)); 
if (config != null) {config.Default = null;} 

しかし、これは動作しません。

DateTime.NowDateTime.Todayのプロパティを隠すことで、テスト中、特に統合やユーザーの受け入れ中に、現在の日付と時刻が表示されるようにシステムを構成できるようにします。私がやろうとした何

はその後、私はちょうどDateTime.NowDateTime.Today


を使用したいがあった場合、私はそれを作成し、呼びたい、インタフェースのデフォルトの実装があったかどうかをチェックし、もしなかったです私は構造体マップにデフォルトの型を削除するよう指示することはできないようですので、今度はインターフェイスの新しいデフォルトの実装を追加し、アクティブであるかどうかを示すプロパティを持つようにインターフェイスを拡張しました。デフォルト実装は、インタフェースがアクティブでないことを示します。今はいつもインスタンスを取得して、それを使いたいかどうかを確認できます。

システムには日付と時刻固有の動作がかなりあり、クライアントはさまざまな日時にシステムがどのように動作するかをテストする必要があります。彼らは管理セクションにログインし、適切な値に日付と時刻を設定してから、デフォルト実装を適切な調整を行うテスト実装に切り替えます。それは私はちょうど私がクライアント管理者がそれを設定するときに使用したい実装切り替え、その後、それらは実行時のIoCの設定を変更

答えて

1

ユーザーが変更したスイッチによってスイッチが制御されている場合、そのスイッチはデータベースか多分セッションであると推測していますか?この場合、あなたはこれを行うにはのStructureMapの条件付き構築機能を使用することができます。

var container = new Container(x => 
{   
    x.InstanceOf<IDateAdjuster>().Is.Conditional(o => 
    {     
    o.If(c => c.GetInstance<IUserSettings>() 
    .UseTestDateAdjuster).ThenIt.Is.OfConcreteType<DateAdjusterForTest>(); 

    o.TheDefault.Is.OfConcreteType<DateAdjuster>(); 
    }); 
}); 

IUserSettingsは、ユーザーが日付と時刻を設定している場合それはあなたを教えてくれます含んで登録されているものかもしれません、管理セクション。

詳細については、このブログを参照してください。http://codebetter.com/jeremymiller/2009/01/19/conditional-object-construction-in-structuremap-i-e-fun-with-lambdas/

+0

これはうまくいくかもしれませんが、残念ながらその例はあまり明確ではありません。主な問題は、コンストラクタが必要なインスタンスを知らないため、ビルド方法がわからない場合です。 – baralong

+0

決定を行うロジックの例を使用して質問を編集すると、それがこの構文にどのように適合するかを示唆しています。 –

+0

条件付き建設に関するヒントを編集しましたか?それとももっと情報が必要ですか? – baralong

2

をある行われているときにそれをリセットする変更インタフェースの唯一の実装であるため

少し怖いIMO。おそらく、工場を使用する方がクリーンなソリューションになるでしょう。例えば:

public interface IOptionalFactory 
{ 
    IOptional GetInstance(IPrinciple currentUser); 
} 

あなたが代わりにIOptionalインタフェースのIOptionalFactoryを注入し、工場出荷時は、供給されたユーザ情報に基づいて、異なるインスタンスを返すさせることができます。

+1

実行時にIOC設定が怖いのはなぜですか?私は実際にIOCにシステムが現在インターフェイスの実装を使用したい状態に入ったことを伝える方法の直後です。この段階では、デフォルトとしてヌル実装を行い、2つの間で切り替えることを考えています – baralong

+0

コンポジションルートにコンテナを設定した後にコンテナの設定を変更すると、コンフィギュレーションははるかに複雑になりますそれが間違っていることの変化。おそらく、そのようなコードの単体テストを書く必要があります。あなたが解決しようとしている問題を私に見てもらうのは難しいですが、私はあなたがそのために複雑な構成を必要としているとは思っていません。おそらく、実際のアプリケーションコードに関する情報で質問を更新することができます。 – Steven

関連する問題