Pergunta

Eu estou tentando construir minha própria inversão do recipiente de controle. Agora eu armazenar os objetos com seus tipos em um dicionário e resolver uma referência quando solicitado. Mas eu quero torná-lo possível para resolver uma referência ou uma nova instância. Posso criar uma nova instância com a classe Activator. Mas, e se o construtor do objeto a determinação leva 1, 2 ou quaisquer parâmetros?

Por exemplo, eu quero ser capaz de dizer algo como:

Container.register<IFoo>(new Foo(Proxy));
Container.register<IBar>(new Boo(Proxy, DataThing));

e resolvê-lo como

IFoo MyFoo = Resolver.resolve<IFoo>();
IBar MyBar = Resolver.resolve<IBar>();

onde myFoo fica instanciated com o parâmetro dado Proxy e MyBar com Proxy e DataThing .

O que resolve tem que fazer para que isso aconteça?

Foi útil?

Solução 2

Eu decidi dividi-lo para métodos. A resolução, que dá de volta a instância armazenado no recipiente. E uma Criar que instanciar uma nova instância.

algo como:

 public T Create<T>()
         {
             if (registeredTypes.ContainsKey(typeof(T)))
                 return (T)Activator.CreateInstance(registeredTypes[typeof(T)].
                                                                       GetType());
             else
                 throw new DependencyResolverException("Can't
                                       create type. Type " + typeof(T) + "
                                                           not found.");
         }

Outras dicas

http://funq.codeplex.com . Esta é uma muito pequena Container que as expressões lambda usos para definir a função de resolver. Lida com vários parâmetros.

Activator pode criar uma instância de uma classe que tem construtores com parâmetros.

Tenha um olhar para essa sobrecarga de CreateInstance método.

Você pode fornecer um costume aglutinante para procurar combinando construtor manualmente.

No seu caso resolve método deve retornar referência a uma instância da classe registrada (novo Boo (Proxy, DataThing) no seu exemplo)

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