Domanda

Come faccio ad avere Microsoft unità alla 'costruzione' un elenco delle classi per un determinato tipo di interfaccia.

esempio molto semplice:

  List<IShippingCalculation> list = new List<IShippingCalculation>();
  list.Add(new NewYorkShippingCalculation());
  list.Add(new FloridaShippingCalculation());
  list.Add(new AlaskShippingCalculation());

  //Not What I want
  public void calcship(List<IShippingCalculation> list)
  {
    var info = new ShippingInfo(list);
    info.CalculateShippingAmount(State.Alaska)
  }

  //Somehow in unity, must i do this for all the concrete classes? 
  //how does it know to give a list.
  Container.RegisterType<IShippingInfo,new AlaskaShippingCalculation()>();??

  //What I want
  public void calcship(IShippingInfo info)
  {
    info.CalculateShippingAmount(State.Alaska)
  }

Grazie!

È stato utile?

Soluzione

Se si utilizza l'unità 2 è possibile utilizzare ResolveAll<T>

Container.RegisterType<IShippingInfo,FloridaShippingCalculation>("Florida");
Container.RegisterType<IShippingInfo,NewYorkShippingCalculation>("NewYork");
Container.RegisterType<IShippingInfo,AlaskaShippingCalculation>("Alaska");

IEnumerable<IShippingInfo> infos = Container.ResolveAll<IShippingInfo>();

Devi dare un nome ad ogni registrazione, in quanto ResolveAll sarà return nome solo registrazioni.

Altri suggerimenti

Non c'è bisogno di avere il contenitore come parametro, registrare i tipi concreti con nomi come detto sopra, poi nel costruttore aggiungere un array come parametro, IList o generico Enum non funziona.

public MyConstructor(IMyType[] myTypes)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top