2011-12-23 3 views
10

Ho il tipo seguente essere registrati in Unity:Come posso passare gli argomenti del costruttore quando registro un tipo in Unity?

container.RegisterType<IAzureTable<Account>, AzureTable<Account>>(); 

La definizione e costruttori per AzureTable sono i seguenti:

public class AzureTable<T> : AzureTableBase<T>, IInitializer where T : TableServiceEntity 
{ 

    public AzureTable() : this(CloudConfiguration.GetStorageAccount()) { } 
    public AzureTable(CloudStorageAccount account) : this(account, null) { } 
    public AzureTable(CloudStorageAccount account, string tableName) 
      : base(account, tableName) { } 

Posso specificare gli argomenti del costruttore nella linea RegisterType? Ho bisogno di essere in grado di passare in tableName per esempio.

Questo è un seguito alla mia ultima domanda. Questa domanda è stata la risposta, ma non ho chiesto in modo chiaro come ottenere gli argomenti del costruttore.

risposta

23

Questa è una pagina MSDN che descrive ciò che è necessario, Injecting Values. Dai un'occhiata all'utilizzo della classe InjectionConstructor nella riga del tipo di registro. Si finisce con una linea come questa:

container.RegisterType<IAzureTable<Account>, AzureTable<Account>>(new InjectionConstructor(typeof(CloudStorageAccount))); 

I parametri del costruttore a InjectionConstructor sono i valori da passare al vostro AzureTable<Account>. Tutti i parametri typeof lasciano l'unità per risolvere il valore da utilizzare. In caso contrario, si può solo passare l'implementazione:

CloudStorageAccount account = new CloudStorageAccount(); 
container.RegisterType<IAzureTable<Account>, AzureTable<Account>>(new InjectionConstructor(account)); 

O un parametro denominato:

container.RegisterType<CloudStorageAccount>("MyAccount"); 
container.RegisterType<IAzureTable<Account>, AzureTable<Account>>(new InjectionConstructor(new ResolvedParameter<CloudStorageAccount>("MyAccount"))); 
+0

Grazie mille per il vostro aiuto. Questo è proprio quello di cui ho bisogno. –

4

si potrebbe dare a questo una prova:

// Register your type: 
container.RegisterType<typeof(IAzureTable<Account>), typeof(AzureTable<Account>)>() 

// Then you can configure the constructor injection (also works for properties): 
container.Configure<InjectedMembers>() 
    .ConfigureInjectionFor<typeof(AzureTable<Account>>(
    new InjectionConstructor(myConstructorParam1, "my constructor parameter 2") // etc. 
); 

Maggiori informazioni da MSDN here.

+0

Grazie mille per il tuo aiuto. Questo è proprio quello di cui ho bisogno. –

+0

Nessun problema, piacere mio. Buon Natale :) –