私はこのような擬似オブジェクトを持っています(疑似コード):
class Parent {
String token;
Child[] children;
}
token
文字列とChild
オブジェクトの配列が含まれます。私の問題は、これらのChild
オブジェクトのそれぞれがtoken
クラスからParent
文字列にアクセスする必要があることです。
私の最初の直感は、子をループし、Parent
オブジェクトへの参照を具体的に設定することです。これを処理するためのより推奨される方法はありますか、またはこの種のカップリングは避けられませんか?私は特にC#で作業していますが、言語に依存しないソリューションにも興味があります。
子の親への参照は1つのメソッドです。もう1つは、(子のメソッドが親によって呼び出されている場合)親(またはトークンのみ)を必要な場所にパラメーターとして渡すことです。
決定に影響を与える可能性のある要因:
問題によって異なります。しかし、スコープ付きのサービスコンテナーはここで役立ちます。
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/