Używam Simple Injector, ale może potrzebuję więcej konceptualnej odpowiedzi.W jaki sposób za pomocą wtyczki zależności uzyskać konfigurację z wielu źródeł?
Oto oferta, załóżmy mam interfejs z moich ustawień aplikacji:
public interface IApplicationSettings
{
bool EnableLogging { get; }
bool CopyLocal { get; }
string ServerName { get; }
}
Następnie należałoby zazwyczaj mają klasę, która implementuje IApplicationSettings, coraz każde pole z określonego źródła, na przykład:
public class AppConfigSettings : IApplicationSettings
{
private bool? enableLogging;
public bool EnableLogging
{
get
{
if (enableLogging == null)
{
enableLogging = Convert.ToBoolean(ConfigurationManager.AppSettings["EnableLogging"];
}
return enableLogging;
}
}
...
}
JEDNAK! Załóżmy, że chcę uzyskać EnableLogging
z app.config, CopyLocal
z bazy danych i ServerName
z innej implementacji, która pobiera bieżącą nazwę komputera. Chcę móc łączyć ze sobą konfigurację mojej aplikacji bez konieczności tworzenia 9 implementacji, po jednej dla każdej kombinacji.
Zakładam, że nie mogę przekazać żadnych parametrów, ponieważ interfejsy są rozwiązywane przez wtryskiwacz (kontener).
myślałem o tym, początkowo:
public interface IApplicationSettings<TEnableLogging,TCopyLocal,TServerName>
where TEnableLogging : IGetValue<bool>
where TCopyLocal : IGetValue<bool>
where TServerName : IGetValue<string>
{
TEnableLogging EnableLog{get;}
TCopyLocal CopyLocal{get;}
TServerName ServerName{get;}
}
public class ApplicationSettings<TEnableLogging,TCopyLocal,TServerName>
{
private bool? enableLogging;
public bool EnableLogging
{
get
{
if (enableLogging == null)
{
enableLogging = Container.GetInstance<TEnableLogging>().Value
}
return enableLogging;
}
}
}
Jednak z tego mam jeden główny problem: Skąd mam wiedzieć, jak utworzyć instancję TEnableLogging
(co jest IGetValue<bool>
)? Załóżmy, że IGetValue<bool>
to interfejs, który ma właściwość Value, która zostanie zaimplementowana przez konkretną klasę. Ale konkretna klasa może potrzebować pewnych szczegółów (jak na przykład nazwa klucza w app.config) lub nie (może po prostu chcę wrócić zawsze prawdziwie).
Jestem stosunkowo nowy w zastrzyku uzależnienia, więc może myślę w niewłaściwy sposób. Czy ktoś ma jakieś pomysły, jak to osiągnąć?
(może odpowiedzieć używając innej biblioteki DI, nie będę nic. Chyba wystarczy chwycić pojęcie IT).
Dziękuję, że popełnił wiele sensu! Ciekawe, że obaj podjęliśmy podobne kroki i zdaliśmy sobie sprawę, że coś idzie nie tak, jak powinno być haha –