Pergunta

Como posso passar argumentos para um construtor em uma IOC-quadro? Eu quero fazer algo como: (Tentando ser IOC-estrutura agnóstico;))

object objectToLogFor = xxx;
container.Resolve<ILogging>(objectToLogFor); 

public class MyLogging : ILogging
{
    public MyLogging(object objectToLogFor){}
}

Parece que isso não é possível em StructureMap. Mas eu adoraria ver alguém me provar que estou errado.

Tem outras estruturas mais rico em recursos? Ou eu estou usando o IOC-estrutura no caminho errado?

Foi útil?

Solução

Na estrutura do mapa você pode conseguir isso usando o método Com:

string objectToLogFor = "PolicyName";
ObjectFactory.With<string>(objectToLogFor).GetInstance<ILogging>();

Veja: http://codebetter.com/blogs/jeremy.miller/archive/2008/09/25/using-structuremap-2-5-to-inject-your-entity -objects-into-services.aspx

Outras dicas

Para o Castelo de Windsor:

var foo = "foo";
var service = this.container.Resolve<TContract>(new { constructorArg1 = foo });

Observe o uso de um objeto anônimo para especificar argumentos do construtor.

usando StructureMap:

var foo = "foo";
var service = container.With(foo).GetInstance<TContract>();

Como isso pode ser a linguagem-agnóstico? Este é detalhe de implementação do quadro em questão.

Spring alows você especifique args c'tor como uma lista de valores / referências, se isso é coisa sua. Não é muito legível, no entanto, em comparação com injeção de propriedade.

Algumas pessoas ficar quente sob o colar sobre isso, e insistem que a injeção c'tor é a abordagem única thread-safe em java. Tecnicamente eles estão corretos, mas, na prática, tende a não importa.

Não deve ser uma necessidade muito comum, mas às vezes é um válido. Ninject , que é mais leve do que StructureMap, permite passar parâmetros ao recuperar objetos transitórios a partir do contexto. Spring.NET também.

Na maioria das vezes, objetos declarou em um contêiner IoC não são transitórios, e aceitar os outros objetos não-transitórios através de construtores / propriedades / métodos como dependências.

No entanto, se você realmente quero para usar o recipiente como uma fábrica, e se você tem controle suficiente sobre os objetos que você deseja resolver, você pode usar a propriedade ou injeção método ainda se parece em menos natural e mais arriscado alguma forma.

Sim, outras estruturas são mais ricos em recursos - você precisa usar um framework IOC que permite a injeção de construtor. A mola é um exemplo de um recipiente multi-ioc língua que permite a injecção construtor dependência.

Outros frameworks de IoC são mais rico em recursos.

i. consulte a ParameterResolution com Autofac

Você também pode fazer isso com Windsor facilmente

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