sagen, dass ich die folgende Service-Vertrag und zwei konkrete Implementierungen haben:eine konkrete Implementierung eines WCF Servicecontract basiert off-Wert in einer Konfigurationsdatei Injizieren dymamically
[OperationContract]
public interface ISearchService {
public ICollection<string> Search(string text);
}
[SearchServiceBehaviour]
public class SolrSearchService : ISearchService {
public ICollection<string> Search(string text) {
// Implementation...
}
}
[SearchServiceBehaviour]
public class SqlSearchService : ISearchService {
public ICollection<string> Search(string text) {
// Implementation...
}
}
Diese mit einem ServiceBehavior
zugeschrieben werden, so dass ich das schaffen kann Beispiel während der Dienst eine Konfigurationsdatei basiert weg läuft:
public class SearchServiceBehaviour : Attribute, IServiceBehavior {
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) {
foreach (var item in serviceHostBase.ChannelDispatchers) {
var dispatcher = item as ChannelDispatcher;
if (dispatcher != null) {
dispatcher.Endpoints.ToList().ForEach(e => {
e.DispatchRuntime.InstanceProvider = new SearchServiceInstanceProvider();
});
}
}
}
}
public class SearchServiceInstanceProvider : IInstanceProvider {
public object GetInstance(InstanceContext instanceContext, Message message) {
// Should cache and only do this at an interval.
ConfigurationManager.RefreshSection("appSettings");
var index = ConfigurationManager.AppSettings["UseSolr"] as string;
bool UseSolr;
bool.TryParse(index, out UseSolr);
if (UseSolr)
return new IndexedSearchService();
else
return new SearchService();
}
}
Meine Frage ist, wie kann ich die konkrete Umsetzung injizieren mit Ninject einen sich ändernden Wert in einer Konfigurationsdatei basiert weg? Es scheint zu mir folgend tun soll:
public class SearchServiceModule : NinjectModule {
private bool UseSolr;
public SearchServiceModule() {
// Should cache and only do this at an interval.
ConfigurationManager.RefreshSection("appSettings");
var index = ConfigurationManager.AppSettings["UseSolr"] as string;
bool.TryParse(index, out UseSolr);
}
public override Load() {
if (UseSolr)
Bind<ISearchService>().To<SolrSearchService>();
else
Bind<ISearchService>().To<SqlSearchService>();
}
}
Und dann in den InstanceProvider
:
public object GetInstance(InstanceContext instanceContext, Message message) {
return _kernel.Get<ISearchService>();
}
jedoch die Bindungen in Ninject nicht ändern, nachdem ich den Wert in der Konfigurationsdatei ändern . Gibt es eine Möglichkeit, die Bindung basierend auf dem Wert in der Konfigurationsdatei zu ändern? Mache ich hier etwas falsch?
Ist dieser Dienst in IIS gehostet oder in einem Konsolen/Windows-Dienst selbst gehostet? –
@DrewMarsh Selbst in einem Windows-Dienst gehostet. – Soliah