というインターフェイスがありますIContext
。この目的のために、以下を除いて、実際に何をするかは重要ではありません。
T GetService<T>();
このメソッドが行うことは、アプリケーションの現在のDIコンテナを調べ、依存関係を解決しようとすることです。かなり標準だと思います。
ASP.NET MVCアプリケーションでは、コンストラクターは次のようになります。
protected MyControllerBase(IContext ctx)
{
TheContext = ctx;
SomeService = ctx.GetService<ISomeService>();
AnotherService = ctx.GetService<IAnotherService>();
}
そのため、各サービスのコンストラクターに複数のパラメーターを追加するのではなく(アプリケーションを拡張する開発者にとってこれは非常に面倒で時間がかかるため)、このメソッドを使用してサービスを取得しています。
今、それは間違っていると感じています。しかし、私が現在頭の中でそれを正当化している方法はこれです- 私はそれをあざけることができます。
できます。IContext
Controllerをテストするためにモックアップすることは難しくありません。とにかくする必要があります:
public class MyMockContext : IContext
{
public T GetService<T>()
{
if (typeof(T) == typeof(ISomeService))
{
// return another mock, or concrete etc etc
}
// etc etc
}
}
しかし、私が言ったように、それは間違っているように感じます。どんな考え/虐待も歓迎します。
public SomeClass(Context c)
。このコードは非常に明確ですよね?にthat SomeClass
依存していると述べていContext
ます。エラー、しかし、待って、それはしません!X
Contextから取得する依存関係のみに依存します。つまり、sを変更しただけでも、変更を加えるたびに破損Context
する可能性がSomeObject
あります。しかし、ええ、あなたはあなたが変更しただけではないことを知っているので、元気です。しかし、良いコードを書くことは、あなたが知っていることではなく、新しい従業員があなたのコードを初めて見たときに知っていることです。Context
Y
Y
X
SomeClass