Como definir um construtor padrão de código usando StructureMap?
-
08-07-2019 - |
Pergunta
Eu não consigo descobrir como definir o construtor padrão (quando existe sobrecargas) para um tipo em StructureMap (versão 2.5) pelo código.
Eu quero obter uma instância de um serviço e o recipiente tem que injetar uma instância de contexto de dados Linq2Sql para ele.
Eu escrevi isso no meu método 'bootstrapper':
ForRequestedType<MyDataContext>().TheDefault.Is.OfConcreteType<MyDataContext>();
Quando eu executar o meu aplicativo, eu tenho esse erro:
StructureMap Exception Código: 202
Não Padrão Instância definido para PluginFamily MyNamespace.Data.SqlRepository.MyDataContext, MyNamespace.Data, versão = 1.0.0.0, Culture = neutral, PublicKeyToken = null
Se eu comentar todas contructors Linq2Sql gerado que eu não preciso, ele funciona bem.
Update: Ah, e eu esqueci de dizer que eu não iria usar o atributo [StructureMap.DefaultConstructor]
Solução
Você pode especificar um construtor com o ConstructedBy (). Por favor, tente o seguinte:
ForRequestedType<MyDataContext>().TheDefault.
Is.ConstructedBy(() => new MyDataContext());
Isso funcionou para mim.
Outras dicas
Eu estou supondo que você também tinha necessidade de definir a vida útil do objeto (InstanceScope) se você estiver usando Linq2Sql. Eu sugiro usar este código, pois dar-lhe um pouco mais de flexibilidade.
ForRequestedType< MyDataContext >()
.CacheBy( InstanceScope.PerRequest )
.TheDefault.Is.OfConcreteType< MyDataContext >()
SelectConstructor< MyDataContext >( () => new MyDataContext());
Com este código você também pode mais interfaces de injetar definições para o construtor MyDataContext como este
SelectConstructor< MyDataContext >( () => new MyDataContext((IDatabaseFactory)null ));
Apenas lembre-se de definir o tipo de concreto com StructureMap para a instância IDatabaseFactory.
Eu não tenho certeza de como / se ele pode ser feito com a interface fluente / DSL interno. No entanto, você pode usar um atributo, se você não estiver com muita pressa sobre poluindo seu domínio ?
Tag seu construtor preferencial com padrões [DefaultConstructor] StructureMap para o construtor ganancioso por convenção (construtor com o maior número de parâmetros).