Creo que sé lo que quieres hacer. Estoy en el mismo barco y estoy tratando de encontrar una solución.
Mi capa de servicio realiza operaciones en las próximas solicitudes, y lo que hace depende de los contenidos. Lo pasa a una serie de clases de cadena de responsabilidad.Quiero que se pase el mismo contexto a todas las clases dentro de la vida útil del método de servicio llamado
Puede especificar PerResolveLifetimeManager. Hasta el momento, parece estar funcionando con mis casos de prueba:
Servicio Clase:
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 se lleva a cabo por dos clases, y lleva a cabo la cadena de patrón de Responsabilidad:
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");
}
}
Como puede ver, ambos controladores aceptan una instancia de IDataContext, que quiero ser el mismo en ambos. Handler2 también acepta una instancia de IHandler para pasar el control a (aquí hace ambos para demostrar, pero en realidad, solo uno manejaría la solicitud ...)
IDataContext. En el constructor que inicializa un Guid, y durante su funcionamiento, la salida es para que pueda ver si las dos veces su llamada está utilizando la misma instancia:
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);
}
}
Por último, el registro y la vocación de servicio:
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();
}
ésta es la salida me sale:
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
esperanza este muro de texto respondió a su pregunta ... Si no lo siento, inspiraba una solución que necesitaba para poner en práctica ...
actualicé mi respuesta –