Penso di sapere cosa vuoi fare. Sono nella stessa barca e sto cercando di trovare una soluzione.
Il mio livello di servizio esegue le operazioni nelle richieste in arrivo e ciò che fa dipende dal contenuto. Lo passa a una serie di classi di responsabilità.Voglio che lo stesso contesto venga passato a tutte le classi entro la durata del metodo di servizio chiamato
È possibile specificare PerResolveLifetimeManager. Finora, sembra di poter lavorare con i miei casi di test:
Classe di servizio:
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 è realizzato da due classi, ed esegue Catena di modello Responsabilità:
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");
}
}
Come si può vedere, entrambi i gestori accettano un'istanza di IDataContext, che voglio essere uguale in entrambi. Handler2 accetta anche un'istanza di IHandler per passare il controllo a (lo fa qui per dimostrare, ma in realtà, solo uno gestirà la richiesta ...)
IDataContext. Nel costruttore ho inizializzare un Guid, e durante il suo funzionamento, l'uscita è così posso vedere se entrambe le volte la sua chiamata sta utilizzando la stessa istanza:
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);
}
}
Infine, la registrazione e la chiamata di servizio:
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();
}
questa è l'uscita ottengo:
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
Spero che questo muro di testo risposto alla tua domanda ... Se non mi dispiace, ha ispirato una soluzione avevo bisogno di implementare ...
aggiornato la mia risposta –