Tôi nghĩ rằng tôi biết những gì bạn muốn làm. Tôi đang ở cùng một chiếc thuyền và đang cố gắng tìm ra một giải pháp.
Lớp dịch vụ của tôi thực hiện các thao tác trong các yêu cầu sắp tới và điều gì tùy thuộc vào nội dung. Nó chuyển nó đến một chuỗi các lớp trách nhiệm.Tôi muốn cùng một bối cảnh được chuyển đến tất cả các lớp trong vòng đời của phương thức dịch vụ được gọi là
Bạn có thể chỉ định PerResolveLifetimeManager. Cho đến nay, có vẻ như được làm việc với các trường hợp thử nghiệm của tôi:
Service Class:
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 được thực hiện bởi hai lớp, và thực hiện Chuỗi mẫu Trách nhiệm:
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");
}
}
Như bạn có thể thấy, cả hai trình xử lý đều chấp nhận một thể hiện của IDataContext, mà tôi muốn giống nhau trong cả hai. Handler2 cũng chấp nhận một trường hợp của IHandler để vượt qua quyền kiểm soát (cả hai đều ở đây để chứng minh, nhưng trên thực tế, chỉ có một người sẽ xử lý yêu cầu ...)
IDataContext. Trong constructor tôi khởi tạo một Guid, và trong quá trình hoạt động, đầu ra nó vì vậy tôi có thể thấy nếu cả hai lần nó được gọi là đang sử dụng cùng một ví dụ:
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);
}
}
Cuối cùng, trước bạ và gọi điện thoại của dịch vụ:
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();
}
Đây là sản phẩm tôi nhận được:
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
Hope bức tường này của văn bản trả lời câu hỏi của bạn ... Nếu không xin lỗi, nó đã truyền cảm hứng cho một giải pháp tôi cần thiết để thực hiện ...
cập nhật câu trả lời của tôi –