11

Non sicuro se questo è possibile o no.È possibile utilizzare lo strumento Factory digitato per restituire l'implementazione in base al parametro (enum)?

Ho bisogno di restituire la corretta implementazione di un servizio basato su un valore enum. Così l'attuazione codificati a mano sarebbe simile:

public enum MyEnum 
{ 
    One, 
    Two 
}  

public class MyFactory 
{ 
    public ITypeIWantToCreate Create(MyEnum type) 
    { 
    switch (type) 
    { 
     case MyEnum.One 
      return new TypeIWantToCreate1(); 
      break; 
     case MyEnum.Two 
      return new TypeIWantToCreate2(); 
      break; 
     default: 
      return null;  
    }  
    } 
} 

Le implementazioni che vengono restituiti hanno dipendenze addizionali che dovranno essere iniettato attraverso il contenitore, in modo una fabbrica di laminati a mano non funziona.

E 'possibile, e se sì, come sarebbe la registrazione?

+0

Cosa c'è di sbagliato con la registrazione quella fabbrica nel vostro contenitore, e invece di fare 'nuova Type1', basta chiamare nel contenitore? – Steven

+0

Non voglio risolvere direttamente dal contenitore: non avrò accesso al contenitore a questo punto del codice. –

+0

Rendi la parte di fabbrica della [Composition Root] (http://blog.ploeh.dk/2011/07/28/CompositionRoot.aspx) della tua applicazione (e falla dipendere da un'interfaccia 'IMyFactroy' che fa parte di l'applicazione). In tal caso, è sufficiente accedere al contenitore ([questo * non * è l'anti-pattern di Service Locator] (http://blog.ploeh.dk/2011/08/25/ServiceLocatorRolesVsMechanics.aspx)). Basta iniettare il contenitore nel costruttore della fabbrica e stai bene. – Steven

risposta

8

Se la registrazione del componente nel contenitore specificando il valore enum come componente id è un'opzione, è possibile prendendo in considerazione questo approccio troppo

public class ByIdTypedFactoryComponentSelector : DefaultTypedFactoryComponentSelector 
{ 
     protected override string GetComponentName(MethodInfo method, object[] arguments) 
     { 
      if (method.Name == "GetById" && arguments.Length > 0 && arguments[0] is YourEnum) 
      { 
       return (string)arguments[0].ToString(); 
      } 

      return base.GetComponentName(method, arguments); 
     } 
} 

di ByIdTypedFactoryComponentSe lector verrà utilizzato come selettore per la vostra fabbrica digitato

public enum YourEnum 
{ 
    Option1 
} 

public IYourTypedFactory 
{ 
    IYourTyped GetById(YourEnum enumValue) 
} 


container.AddFacility<TypedFactoryFacility>(); 
container.Register 
(  
    Component.For<ByIdTypedFactoryComponentSelector>(), 

    Component.For<IYourTyped>().ImplementedBy<FooYourTyped>().Named(YourEnum.Option1.ToString()), 

    Component.For<IYourTypedFactory>() 
    .AsFactory(x => x.SelectedWith<ByIdTypedFactoryComponentSelector>()) 
    .LifeStyle.Singleton, 

    ... 
+0

e se i parametri richiesti da TypeIWantToCreate1 o TypeIWantToCreate2? Il primo era dedicato alla ricerca del componente e gli altri venivano iniettati nell'istanza Component? –

1

Sembra che questo sia possibile. Date un'occhiata a questo:.

Example

Sarà necessario creare un'implementazione ITypedFactoryComponentSelector per risolvere la chiamata, e registrarlo nel contenitore di risolvere solo le chiamate per le classi a cui sei interessato