2014-12-15 8 views
5

Quello che ho è uno stage, alcune interfacce e anche la sezione di registrazione. Il problema è che ho bisogno di definire alcuni parametri come fissi e altri come variabili.Specificare per i valori fissi della classe di costruzione e altre variabili dal contenitore

interface IDoSomething { 
void DoWork(); 
} 

interface IDoMath(){ 
void DoWork(); 
} 

interface IBehaviorBusiness{ 
void Do(); 
} 

class BehaviorBusiness { 
... 
public BehaviorBusiness(IDoSomething doSomething, IDoMatch doMatch, string connection){}; 
... 
} 

E 'possibile con il contenitore Windsor a definire una connessione parametro nella dichiarazione, e prendere IDosomething e IDoMatch dal contenitore?

container.Register(
    Component.For<IDoSomething>() 
    ... 
} 

container.Register(
    Component.For<IDoMatch>() 
    ... 
); 

Questo è il problema concreto.

container.Register(
    Component.For<IBehaviorBusiness>() 
    .ImplementedBy<BehaviorBusiness>() 
    .DependsOn(Dependency.OnComponent<IDoSomething, [default]>(), 
       Dependency.OnComponent<IDoMatch, [default]>(), 
       Dependency.OnValue("connection", connectionString)) 
    .LifeStyle.Transient 
    ); 

Qual è la sintassi corretta se esiste?

+0

La risposta @PatrickQuirk è giusta, ma penso che un approccio migliore sia quello di rendere il provider IConnectionString o direttamente IConnectionProvider e servirlo nel Ctor piuttosto che un parametro diretto. In questo modo la classe particolare non avrà la responsabilità di creare/gestire/disporre la connessione ogni volta. Che ne pensi di fornire la connessione da un altro componente e quindi raggrupparlo piuttosto che disporlo? In questo modo manterrai l'SRP non solo per il rispetto di alcuni principi, ma per la manutenzione del tuo codice. Puoi dare un esempio dell'uso della tua stringa di connessione? –

+0

beh, il progetto è davvero piccolo e semplice. hai ragione. infine ho cambiato la connessione per un'interfaccia fittizia per la query, aggiornare l'interfaccia pubblica IDbContext { DataSet GetDataSet (string strmSql); DataTable GetDataTable (string strmSql); int ExecuteSql (string strmSql); } alcuni veramente semplici –

+0

@OgnyanDimitrov dove posso leggere sulle migliori pratiche per gli strumenti IConnectionString o IConnectionProvider? la prossima settimana lavoreranno in modo davvero serio e forse leggerò un po 'l'argomento che sarebbe appropriato. Iam considerando l'utilizzo di EF o di NHibernate –

risposta

1

Se la stringa di connessione viene da impostazioni dell'applicazione, quindi utilizzare Dependency.OnAppSettingsValue():

container.Register(
    Component.For<IBehaviorBusiness>() 
    .ImplementedBy<BehaviorBusiness>() 
    .DependsOn(Dependency.OnAppSettingsValue("connection", "connectionString")) 
    .LifeStyle.Transient 
); 

Qui, "collegamento" è il nome del parametro nella classe costruttore e 'connectionString' è la chiave di il valore della stringa di connessione nelle impostazioni dell'applicazione (es. Web.Config). Non è necessario specificare gli altri valori, Windsor li risolverà come al solito.

+0

grazie mille, fratello –

Problemi correlati