StructureMap — вставка зависимости по требованию

я пытаюсь сделать обработку исключений зависимой от контекста. У меня есть класс factory, создающий обработчики исключений. обработчик должен быть построен по последнему выброшенному типу исключения. настраивая структурную карту классическим способом, все работает нормально. пытаясь использовать условное построение, мой код терпит неудачу, и я не понимаю, почему?! Что мне не хватает? Где моя главная ошибка?

привет, -ян

Рабочий код:

ObjectFactory.Initialize(x => 
    x.ForRequestedType<IExceptionHandler>()
        .TheDefault.Is.OfConcreteType<MyExceptionHandler>());

Нерабочий код

ObjectFactory.Initialize(x =>
    x.ForRequestedType<IExceptionHandler>().TheDefault.Is.Conditional(o =>
        o.TheDefault.Is.OfConcreteType(MyExceptionHandler)));

Получение экземпляра:

IExceptionHandler handler = ObjectFactory.With("exception").EqualTo(exception).GetInstance<IExceptionHandler>();

Итак, я постараюсь быть более конкретным:

У меня есть BaseExceptionHandler, MyExceptionHandler, наследующий от Base, и MyException, наследуемый от System.Exception. Прямо сейчас, если я попытаюсь получить свой обработчик, я получу ошибку 202: не определен экземпляр по умолчанию для PluginFamily MyException...
Классы выглядят так, как показано ниже...

public class MyException : System.Exception
{
    public MyException()
    {...}
    ...
}

public class BaseExceptionHandler
{
    public BaseExceptionHandler(Exception exception)
    {...}
    ...
}

public class MyExceptionHandler : BaseExceptionHandler
{
    public MyExceptionHandler(MyException exception) : base(exception)
    {...}
    ...
}

person Jan Christian Selke    schedule 27.10.2009    source источник


Ответы (1)


Ваша проблема не имеет ничего общего с условной регистрацией. Это связано с тем, как вы передаете исключение. Синтаксис .With(string parameterName) следует использовать только с примитивными типами (string, int и т. д.). В качестве исключения вам нужен синтаксис With(T instance):

IExceptionHandler handler = ObjectFactory.With<Exception>(exception).GetInstance<IExceptionHandler>();
person Joshua Flanagan    schedule 28.10.2009
comment
Привет, спасибо, Джошуа, мне стало намного понятнее. Однако сейчас я получаю ошибку 202. Вероятно, это как-то связано с конструкторами, поэтому я буду более конкретным в отношении задействованных классов. спасибо -ян - person Jan Christian Selke; 28.10.2009