操り人形の達人がひもを引っ張るのと同じように、下の層を上の層で制御する必要があるシナリオがあります。
一部の内部イベントが時々生成されるため、下位層も上位層にコールバックします。
SimpleInjectorを使用しており、ILowerをUpperコンストラクターに注入します。循環参照が発生するため、アッパーをロワーに注入できません。
代わりに、2つのレイヤーをリンクするためのレジスタコールバック関数があります。ただし、nullチェックを使用してコードを分散させる必要があります。
このオブジェクトのリンクを実現するためのより良い方法や異なるアーキテクチャはありますか?
// an interface that transport can callback from transport to client
public interface ILowerToUpperCallback
{
void ReplyA();
void ReplyB();
}
// transport interface that client calls
public interface ILower
{
void Test1();
void Test2();
void RegisterCallback(ILowerToUpperCallback callback);
}
public class Upper : ILowerToUpperCallback
{
private readonly ILower lower;
public Upper(ILower lower)
{
this.lower = lower;
this.lower.RegisterCallback(this);
}
void ReplyA()
{
}
void ReplyB()
{
}
}
public class Lower : ILower
{
private ILowerToUpperCallback callback;
/* this is not possible, would cause a circular reference
public Lower(ILowerToUpperCallback callback)
{
this.callback = callback;
}
*/
// set by different method instead, what happens if this is never set?!
void RegisterCallback(ILowerToUpperCallback callback)
{
this.callback = callback;
}
void OnTimer()
{
// some timer function
if(this.callback != null) // these null checks are everywhere :(
this.callback.ReplyA();
}
}