2011-08-11 29 views
2

私は、あるインスタンスに対して "None"というSpecial Caseを返します。StructureMapは特別なケースを返すことができますか?

私はこのクラスをHttpContextとしてスコープされたMyUserとしましょう。 (ブートストラップで、Application_Start()などのように、例えば)はHttpContextが存在しないとき、私はタイプMyUserためreturtnedされ、ネストされた、dreivedクラスNone(すなわち。MyUser.None)を持っていると思います。

これは、特定の呼び出しが

if(value is MyUser.None) 
    // do special case things 
else 
    // do normal case things 

何SMの設定

のような特殊なケースタイプの代わりに、ヌル(より読みやすい)をチェックすることができることを意味するだろう、私はこれを達成する必要がありますか?私は多くの成功なしで ConditionallyUseメソッドを試しました。私は NullReferenceExceptionSをSMの中から投げつけ続けています。

答えて

1

私には、基本的なSM構成の問題がありました。私がアクセスすることを望んでた、具体的方法... scoping issueだったようだ原因私は、基礎となる -

 For<User>().ConditionallyUse(config => 
      { 
       config.If(ctx => ctx.GetInstance<HttpContextBase>().User == null) 
        .ThenIt.Is.Type<User.None>(); 
       config.TheDefault.Is.Type<User>(); 
      }); 

私は、SMの中からNullReferenceExceptionSについてより慎重でなければならなかった:

私はまだしかしConditionallyUse方法を使用していますテスト内のスコープ付きインスタンスHttpContext私は現在、HybridHttpOrThreadLocalScoped()の設定を使用しており、の代わりにTryGetInstance()を使用してより慎重になっています。

+0

あなたは私の答えを使用して、それをあなたのものとして書いて、受け入れたようです。あなたは鉱山を受け入れるべきではなく、ちょうどNullReferenceExceptionsや何かを見逃してしまったというコメントを加えてはいけませんか? –

+0

敬意を表するジョシュ。私はそのように見えるようにするつもりはありませんでした。 真実は、私はすでにあなたの答えが提案同じよう 'ConditionallyUse'を使用していたされた(でも、私の質問カントーだけ、私は、それを使用していないか_that_を述べました)。それは、私が潜在的に他の人にとってより価値があると思った根本的な問題(コードスニップ後)によってどのように解決されたかについての実際の説明です。だから私は新しい答えを書いたのです。私は実際に、あなたの答えのFYIでこれを行う方法について、実際には熟考していました。私はあなたの助けに感謝します。 –

+0

何も撮影されておらず、理解しようとしています。あなたの問題を解決してうれしいです。 –

2

このコードは動作するはずです(テストに、あなたがより簡単に別の動作を確認するためにDateTime.Now.Millisecond % 2 == 0ようなものでHttpContext.Currentのチェックを置き換えることができます):

class Program 
{ 
    static void Main(string[] args) 
    { 
     ObjectFactory.Initialize(x => 
     { 
      x.For<IUser>().ConditionallyUse(cond => 
      { 
       cond.TheDefault.Is.Type<MyUser>(); 
       cond.If(ctx => 
       { 
        var hasContext = false; 
        try 
        { 
         hasContext = HttpContext.Current == null; 
        }catch 
        { 
         // HttpContext.Current sometimes throws when there isn't one 
        } 
        return hasContext; 
       }).ThenIt.IsThis(new MyUser.None()); 
      }); 
     }); 

     var instance = ObjectFactory.GetInstance<IUser>(); 
     Console.WriteLine(instance.GetType()); 
    } 

    public interface IUser{} 
    public class MyUser : IUser { public class None : IUser {} } 
} 

ConditionallyUse() APIは少し奇妙であるので、 Use()オーバーロードを使用する場合は、Func<>が必要で、ifステートメントを使用して条件付きで自分でチェックしてください。

+0

私はそれらのアイデアを行っていきます。ありがとう –

関連する問題