Может ли StructureMap вернуть особый случай? - PullRequest
2 голосов
/ 11 августа 2011

Я хочу, чтобы StructureMap возвращал Особый случай с именем "Нет" для определенного экземпляра.

Скажите, у меня есть этот класс MyUser, который определен как HttpContext. Я хочу иметь вложенный, извлеченный класс None (то есть. MyUser.None), который возвращается для типа MyUser, когда нет HttpContext (например, как при начальной загрузке, Application_Start() и т. Д.).

Это будет означать, что определенные вызовы могут проверять тип Special Case вместо null (более читабельный), например

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

Какая конфигурация SM мне нужна для достижения этой цели? Я попробовал метод ConditionallyUse без особого успеха. Я продолжаю получать NullReferenceExceptionS броски изнутри самого СМ.

Ответы [ 2 ]

2 голосов
/ 11 августа 2011

Этот код должен работать (для проверки вы можете заменить проверку 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 {} }
}

Поскольку API ConditionallyUse()это немного странно, вы можете просто использовать перегрузку Use(), которая принимает Func<>, и выполнить условную проверку самостоятельно с помощью оператора if.

1 голос
/ 16 августа 2011

Оказывается, у меня были проблемы с настройкой SM.

Я все еще использую метод ConditionallyUse:

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

Мне нужно было быть более осторожным с NullReferenceExceptionS изнутри SM - моей основной причиной, по-видимому, была проблема с областью действия .. в частности, как я хотел получить доступ к экземпляру HttpContext scoped в тесте , Сейчас я использую конфигурацию HybridHttpOrThreadLocalScoped() и более осторожен, используя TryGetInstance() в подходящем месте вместо GetInstance().

...