2

特定のインスタンスに対して、StructureMap が「なし」という特殊なケースを返すようにしたいと考えています。

MyUserHttpContext としてスコープされているこのクラスがあるとします。ネストされた、ドライブされたクラスNone(つまりMyUser.None、型MyUserがない場合に返される)が必要ですHttpContext(たとえば、ブートストラップApplication_Start()など)。

これは、特定の呼び出しが null (より読みやすい) の代わりに Special Case 型をチェックできることを意味します。

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

これを実現するには、どの SM 設定が必要ですか? 私はその方法を試しましたが、ConditionallyUseあまり成功しませんでした。NullReferenceExceptionSSM自体からどんどん投げてきます。

4

2 に答える 2

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 {} }
}

API は少し変わっているので、を受け取るオーバーロードを使用して、ステートメントで条件チェックを自分で実行しConditionallyUse()たいだけかもしれません。Use()Func<>if

于 2011-08-11T14:11:11.600 に答える
1

根本的な SM 構成の問題があったことがわかりました。

ただし、私はConditionallyUseまだこの方法を使用しています:

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

NullReferenceExceptionSSM内からはもっと注意する必要がありました-私の根本的な原因はスコープの問題HttpContextだったようです..具体的には、テストでスコープされたインスタンスにどのようにアクセスしたかったのですか。私は現在、構成を使用しており、代わりに適切な場所HybridHttpOrThreadLocalScoped()を使用することでより注意を払っています。TryGetInstance()GetInstance()

于 2011-08-16T07:05:16.380 に答える