Ich denke, ich weiß, was Sie tun möchten. Ich bin im selben Boot und versuche, eine Lösung zu finden.
Meine Service-Schicht führt Operationen bei kommenden Anforderungen aus, und was es tut, hängt vom Inhalt ab. Es übergibt es an eine Kette von Verantwortungsklassen.Ich möchte, dass derselbe Kontext an alle Klassen innerhalb der Lebensdauer der Servicemethode
weitergegeben wird. Sie können PerResolveLifetimeManager angeben. Bisher scheint es mit meinem Testfälle zu arbeiten:
Service-Klasse:
public interface IServiceClass
{
void DoService();
}
class ServiceClass : IServiceClass
{
private IHandler Handler { get; set; }
public ServiceClass(IHandler handler)
{
Handler = handler;
}
public void DoService()
{
Handler.HandleRequest();
}
}
IHandler von zwei Klassen implementiert wird, und führt eine Zuständigkeitskette Muster:
public interface IHandler
{
void HandleRequest();
}
class Handler : IHandler
{
private IDataContext DataContext { get; set; }
public Handler(IDataContext dataContext)
{
DataContext = dataContext;
}
public void HandleRequest()
{
DataContext.Save("From Handler 1");
}
}
class Handler2 : IHandler
{
private IDataContext DataContext { get; set; }
private IHandler NextHandler { get; set; }
public Handler2(IDataContext dataContext, IHandler handler)
{
DataContext = dataContext;
NextHandler = handler;
}
public void HandleRequest()
{
if (NextHandler != null)
NextHandler.HandleRequest();
DataContext.Save("From Handler 2");
}
}
Wie Sie kann sehen, beide Handler akzeptieren eine Instanz von IDataContext, die in beiden gleich sein soll. Handler2 akzeptiert auch eine Instanz von IHandler, an die die Kontrolle übergeben werden soll (beide demonstrieren hier, aber tatsächlich würde nur einer die Anfrage bearbeiten ...)
IDataContext. Im Konstruktor initialisieren ich ein Guid, und während des Betriebs, Ausgabe, die es so kann ich, wenn beide mal sehen seine unter Verwendung der gleichen Instanz genannt:
public interface IDataContext
{
void Save(string fromHandler);
}
class DataContext : IDataContext
{
private readonly Guid _guid;
public DataContext()
{
_guid = Guid.NewGuid();
}
public void Save(string fromHandler)
{
Console.Out.WriteLine("GUI: [{0}] {1}", _guid, fromHandler);
}
}
Schließlich Registrierung und Berufung Service:
private IUnityContainer container;
private void InitializeUnity()
{
container = new UnityContainer();
container.RegisterType<IHandler, Handler2>("Handler2",
new InjectionConstructor(new ResolvedParameter<IDataContext>(), new ResolvedParameter<IHandler>("Handler1")));
container.RegisterType<IHandler, Handler>("Handler1");
container.RegisterType<IDataContext, DataContext>(new PerResolveLifetimeManager());
container.RegisterType<IServiceClass, ServiceClass>("MyClass", new InjectionConstructor(new ResolvedParameter<IHandler>("Handler2")));
}
private void CallService()
{
var service = container.Resolve<ServiceClass>("MyClass");
service.DoService();
// Resolving and calling again to simulate multiple resolves:
service = container.Resolve<ServiceClass>("MyClass");
service.DoService();
}
Dies ist die Ausgabe erhalte ich:
GUI: [f2250055-8a5f-4f80-a1b6-bcc5574138cf] From Handler 1
GUI: [f2250055-8a5f-4f80-a1b6-bcc5574138cf] From Handler 2
GUI: [22a5c0a3-3c5c-4683-807d-bf2b43f3cd0a] From Handler 1
GUI: [22a5c0a3-3c5c-4683-807d-bf2b43f3cd0a] From Handler 2
Hoffnung diese Wand von Text Ihre Frage beantwortet ... Wenn nicht traurig, es eine Lösung inspirieren habe ich umsetzen musste ...
aktualisiert meine Antwort –