StructureMap - Inserir dependência de demanda
-
06-07-2019 - |
Pergunta
eu estou tentando fazer o meu dependend ExceptionHandling do contexto. Eu tenho uma classe de fábrica construção exceptionhandlers. o manipulador deve ser construído pelo último tipo de exceção lançada. configurando StructureMap a maneira clássica, ele funciona bem. tentando usar Construindo condicional, o meu código de falha e eu não posso ver o porquê ?! O que estou perdendo? Onde está o meu grande erro?
Atenciosamente, -Jan
código de trabalho:
ObjectFactory.Initialize(x =>
x.ForRequestedType<IExceptionHandler>()
.TheDefault.Is.OfConcreteType<MyExceptionHandler>());
código não-trabalho
ObjectFactory.Initialize(x =>
x.ForRequestedType<IExceptionHandler>().TheDefault.Is.Conditional(o =>
o.TheDefault.Is.OfConcreteType(MyExceptionHandler)));
Obtendo uma instância:
IExceptionHandler handler = ObjectFactory.With("exception").EqualTo(exception).GetInstance<IExceptionHandler>();
Então, eu vou tentar ser mais específico:
Eu tenho um BaseExceptionHandler, MyExceptionHandler herdando de Base e MyException herdando de System.Exception. Agora, se eu tentar obter o meu manipulador eu recebo um erro 202: Não Padrão Instância definido para PluginFamily MyException ...
As classes olhar como mostrado abaixo ...
public class MyException : System.Exception
{
public MyException()
{...}
...
}
public class BaseExceptionHandler
{
public BaseExceptionHandler(Exception exception)
{...}
...
}
public class MyExceptionHandler : BaseExceptionHandler
{
public MyExceptionHandler(MyException exception) : base(exception)
{...}
...
}
Solução
Seu problema não tem nada a ver com o registro condicional. Tem a ver com a maneira como você está passando a exceção. A (cadeia parameterName) .Com sintaxe só deve ser usado com os tipos de primitivas (String, int, etc). Para uma exceção, você quer a sintaxe Com (exemplo T):
IExceptionHandler handler = ObjectFactory.With<Exception>(exception).GetInstance<IExceptionHandler>();