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]

.
Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top