私はあなたが何をしたいのか知っていると思います。私は同じ船に乗っており、解決策を考え出そうとしています。
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は2つのクラスによって実装され、ChainofResponsibilityパターンを実行します。
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のインスタンスも受け入れます(ここでは両方を示していますが、実際には1つだけが要求を処理します...)
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
このテキストの壁があなたの質問に答えてくれることを願っています...申し訳ありませんが、それは私が実装する必要のある解決策を刺激しました...