2011-08-11 24 views
2

我想让StructureMap为某个实例返回一个名为“None”的Special Case结构图可以返回一个特例吗?

说我有这个类MyUser它的作用域为HttpContext。我想要有一个嵌套的dreived类None(即MyUser.None),当没有HttpContext(例如,像bootstrapping,Application_Start()等)时,它将被重新转换为MyUser类型。

这意味着,某些呼叫可以检查对于特殊情况类型,而不是空(更易读)像

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

什么SM的配置,我需要做到这一点?我已经尝试了ConditionallyUse方法,但没有取得太大的成功。我一直在从SM内部抛出NullReferenceExceptionS

回答

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>(); 
      }); 

我不得不从SM中更加谨慎地NullReferenceExceptionS - 我的根本原因似乎是一个scoping issue ..我具体怎么是想访问HttpContext范围实例在测试中。我现在使用HybridHttpOrThreadLocalScoped()配置,使用TryGetInstance()代替GetInstance()时更谨慎。

+0

它看起来像你用我的答案,把它写成你的,并接受它。你不应该接受我的,只是添加一个评论,你错过了一些NullReferenceExceptions或什么? –

+0

不尊重约什。我不是故意让它看起来像那样。 事实是,我已经在使用'ConditionallyUse'很像你的答案建议(即使我的问题只提到_that_我用它,而不是如何)。这真的是解释我如何解决潜在问题(在代码片断之后),我认为这可能对其他人更有价值。这就是为什么我写了一个新的答案。我确实在思考如何在你的答案中提供参考。我非常感谢你的帮助。 –

+0

没有采取,只是想明白。很高兴你解决了你的问题。 –

2

此代码应该工作(测试,你可以用一些替代支票HttpContext.Current像DateTime.Now.Millisecond % 2 == 0更容易地看到不同的行为):

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是有点怪,您可能只想使用需要Func<>Use()超载,并使用if语句进行条件检查。

+0

我会给出这些想法。谢谢 –

相关问题