Ich habe eine ASP.NET-Anwendung und einen Windows-Dienst. Ich verwende Unity als IoC-Container. Ich habe den Composition Root in eine separate Klassenbibliothek gestellt, da beide Anwendungen den gleichen DI-Container verwenden sollen.Zugriff auf eine statische Variable von verschiedenen Baugruppen
DI Bootstrap:
namespace CompositionRoot {
public static class DiBootstrapper {
private static IUnityContainer _container;
public static IUnityContainer Initialize() {
return _container ?? (_container = BuildUnityContainer());
}
private static IUnityContainer BuildUnityContainer() {
var container = new UnityContainer();
container.AddNewExtension<ContainerExtension>();
return container;
}
}
public class ContainerExtension: UnityContainerExtension {
protected override void Initialize() {
var connectionString = ConfigurationManager.ConnectionStrings["KSecureEntities"].ConnectionString;
var sqlCtorParam = new InjectionConstructor(connectionString);
this.Container.RegisterType < Acquaintance.RSS.IRssRepository, RssRepository > (new ContainerControlledLifetimeManager());
this.Container.RegisterType < IRssFeedRepository, RssFeedRepository > (new TransientLifetimeManager(), sqlCtorParam);
this.Container.RegisterType<IRssTicker, RssTicker>(new ContainerControlledLifetimeManager());
this.Container.RegisterType <RssTickerHub> (new InjectionFactory(RssTickerHub));
....
}
private static object RssTickerHub(IUnityContainer p) {
var rssRepository = p.Resolve <IRssFeedRepository>();
var rssTicker = p.Resolve <IRssTicker>();
var rssTickerHub = new RssTickerHub(rssRepository, rssTicker);
return rssTickerHub;
}
}
}
Das erste Projekt Initialize() auf dem DiBootstrapper ist der Windows-Dienst ausgeführt werden. Wenn die Methode ausgeführt wird, wird die _container-Variable festgelegt.
Anschließend führt die ASP.NET-Anwendung Initialize() aus Application_Start() aus, aber diesmal ist die Variable null und der Container wird erneut instanziiert.
Wie kann ich den gleichen Container für beide Projekte freigeben?
Ein statisches Objekt lebt im Rahmen eines Prozesses. Sie haben zwei: den Service und die Webanwendung. Jeder wird seine eigene Instanz des Containers hosten. Wenn Sie von einem anderen Prozess darauf zugreifen möchten, müssen Sie eine Art von IPC-Protokoll schreiben, das die Aktionen ausführt, die Sie für die Instanz benötigen. Zuerst müssen Sie entscheiden, wo der Container leben soll. Dann müssen Sie einen Dienst implementieren, um dort darauf zuzugreifen. Zuletzt sollten Sie diesen Service aufrufen, um vom Client auf den Container zugreifen zu können. Es gibt viele Möglichkeiten, dies zu tun: .NET Remoting, WCF oder ein High-Level-Framework wie Zyan. – Carsten