Я думаю, я знаю, что ты хочешь сделать. Я в одной лодке и пытаюсь найти решение.
Уровень My Service выполняет операции с входящими запросами, и то, что он делает, зависит от содержимого. Он передает его в серию классов цепочки ответственности. Я хочу, чтобы один и тот же контекст передавался всем классам в течение срока службы метода с именем
Вы можете указать PerResolveLifetimeManager. Пока что похоже на работу с моими тестами:
Класс обслуживания:
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 реализуется двумя классами и выполняет шаблон цепочки ответственности:
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");
}
}
Как видите, оба обработчика принимают экземпляр IDataContext, который я хочу быть одинаковым в обоих из них. Handler2 также принимает экземпляр IHandler для передачи управления (здесь он демонстрирует и то, и другое, но на самом деле только один обработал бы запрос ...)
IDataContext. В конструкторе я инициализирую Guid и выводю его во время его работы, чтобы я мог видеть, использует ли оба раза его вызванный один и тот же экземпляр:
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);
}
}
Наконец, регистрация и вызов услуги:
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();
}
Это вывод, который я получаю:
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
Надеюсь, эта стена текста ответила на ваш вопрос ... Если не извините, это вдохновило на решение, которое мне нужно было реализовать ...