web-dev-qa-db-ja.com

子リストの要素から親の変数にアクセスするための適切なアーキテクチャは何ですか?

私はこのような擬似オブジェクトを持っています(疑似コード):

class Parent {
  String token;
  Child[] children;
}

token文字列とChildオブジェクトの配列が含まれます。私の問題は、これらのChildオブジェクトのそれぞれがtokenクラスからParent文字列にアクセスする必要があることです。

私の最初の直感は、子をループし、Parentオブジェクトへの参照を具体的に設定することです。これを処理するためのより推奨される方法はありますか、またはこの種のカップリングは避けられませんか?私は特にC#で作業していますが、言語に依存しないソリューションにも興味があります。

1
Tim Clancy

子の親への参照は1つのメソッドです。もう1つは、(子のメソッドが親によって呼び出されている場合)親(またはトークンのみ)を必要な場所にパラメーターとして渡すことです。

決定に影響を与える可能性のある要因:

  • 親は変更可能または不変ですか?子供のための同じ質問。
  • 子供が親を変えることはありますか、それとも一度構築されると修正されますか?
  • 子供は複数の親の間で共有されますか?
2
Errorsatz

問題によって異なります。しかし、スコープ付きのサービスコンテナーはここで役立ちます。

var serviceProvider = new ServiceCollection()
   .AddScoped<ITokenProvider, TokenProvider>()
   .AddTransiant<ISomething, ISomethingOne>()
   .AddTransiant<ISomething, ISomethingTwo>()
   .AddTransiant<ISomeUnitOfWork, SomeUnitOfWork>()
   .BuildServiceProvider();

using (var scope = serviceProvider.CreateScope())
{
   await scope.ServiceProvider.GetService<ISomeUnitOfWork>().Work();
}

ITokenProviderはスコープされているため、すべてのサービスは同じスコープの間に同じインスタンスを取得します。

So 

public class SomeUnitOfWork : ISomeUnitOfWork
{
   public SomeUnitOfWork(ITokenProvider tokenProvider, IEnumerable<ISomething> somethings)
   {
      this.tokenProvider = tokenProvider;
      this.somethings = somethings;
   }

   public Task Work() 
   {
      tokenProvider.SetToken("Foobar"); //This can be done anywere in the lifetime of the scope
      return somethings
         .Select(s => s.Execute())
         .WhenAll();
   }
}

public class SomethingOne : ISomething
{
   public SomethingOne(ITokenProvider tokenProvider) 
   {
      this.tokenProvider = tokenProvider;
   }

   public Task Execute() 
   {
      //TODO: Do some work
   }

}

スコープは、大規模なシステムでは非常に強力なツールです。たとえば、フロントエンドでは、各ウィンドウに独自のスコープを設定できます。そして、スコープ内のイベントアグリゲーターを使用して、ウィンドウ内のコンポーネント間でイベントが発生します。

私のブログに関するいくつかの情報(AspNetCore DIを使用していないため、少し時代遅れです) https://andersmalmgren.com/2015/06/23/abstract-di-container-scopes/

0
Anders