依存性注入アプローチ(Ninjectを使用)を使用してライブラリを開発しようとしていますが、設計が正しくないために、ある種の混乱が生じている可能性があります。要約すると、私のデザインアプローチは
parent
オブジェクトにはオブジェクトがありますcommon
。parent
オブジェクトは、いくつかの可変数のオブジェクトを使用しますchild
。- すべての
child
オブジェクトは、オブジェクトとまったく同じcommon
オブジェクトインスタンスを使用する必要がありparent
ます
これが私の問題領域の単純なモデルです。
interface IParent : IDisposable {
void Operation();
}
interface ICommon : IDisposable {
void DoCommonThing();
}
interface IChild1 {
void DoSomething();
}
interface IChild2 {
void DoAnotherThing();
}
class Parent : IParent {
private readonly ICommon _common;
public Parent(ICommon common) {
_common = common;
}
public void Dispose() {
_common.Dispose();
}
public void Operation() {
var c1 = ObjectFactory.GetInstance<IChild1>();
c1.DoSomething();
var c2 = ObjectFactory.GetInstance<IChild2>();
c2.DoAnotherThing();
// number of childs vary, do things until cn
_common.DoCommonThing();
}
}
class Common : ICommon {
private bool _isDisposed;
public void Dispose() {
_isDisposed = true;
}
public void DoCommonThing() {
if (_isDisposed)
throw new Exception("Common Object is Disposed");
}
}
class Child1 : IChild1
{
private readonly ICommon _common;
public Child1(ICommon common) {
_common = common;
}
public void DoSomething() {
// Do Something...
_common.DoCommonThing();
}
}
class Child2 : IChild2 {
private readonly ICommon _common;
public Child2(ICommon common) {
_common = common;
}
public void DoAnotherThing() {
// Do Another Thing...
_common.DoCommonThing();
}
}
問題1
必要なchild
オブジェクトの数は異なります。たとえば、c1.DoSomething
Iの戻り値に応じて、他の子オブジェクトが必要な場合と不要な場合があります。したがって、コンストラクターを介してそれらを注入するのではなく、必要なときに作成するだけです。しかし、このアプローチはハリウッドの原則に違反します。
質問1
コンストラクターを介して子オブジェクトを挿入せずに、この違反をどのように防ぐことができますか?
問題2
child
オブジェクトがそのオブジェクトと同じcommon
オブジェクトインスタンスを使用するようにしたいparent
。したがって、オブジェクトの存続期間はcommon
その親と同じである必要があります。
ICommonに有効期間が定義されていない場合、すべての
child
オブジェクトには独自のcommon
オブジェクトインスタンスがあります。ICommonの有効期間がスレッドまたはリクエストスコープで定義されている場合
parent
、同じスレッドまたはリクエストスコープでオブジェクトの異なるインスタンスを使用することはできません。各parent
オブジェクトは独自の新しいcommon
オブジェクトを使用して破棄する必要があるためです。
そのため、私が知っているライフタイムスコープオプションを使用してそれを解決することはできませんでした。この2番目の問題に対して別の解決策を作成しましたが、コードが悪化します。
まず、オブジェクトにICommon
注入する代わりに、オブジェクト自体がそれを作成しますparent
parent
ObjectFactory
class Parent : IParent {
private readonly ICommon _common;
public Parent() {
_common = ObjectFactory.GetInstance<ICommon>();
}
.....
次に、オブジェクトにICommon
注入する代わりに、オブジェクトは子オブジェクトのオブジェクトを設定します。child
parent
common
interface IChild {
ICommon Common { get; set; }
}
interface IChildN : IChild {
void DoNthThing();
}
abstract class ChildBase : IChild {
ICommon IChild.Common { get; set; }
}
class ChildN : IChildN {
public void DoNthThing() { }
}
class Parent : IParent {
private readonly ICommon _common;
public void Operation() {
var c1 = ObjectFactory.GetInstance<IChild1>();
c1.Common = _common;
c1.DoSomething();
var c2 = ObjectFactory.GetInstance<IChild2>();
c2.Common = _common;
c2.DoAnotherThing();
_common.DoCommonThing();
}
}
child
しかし、このソリューションは再びハリウッドの原則に違反しているため、各オブジェクトの共通プロパティを設定する必要があります。
質問2
依存性注入を使用して、オブジェクトはどのようにオブジェクトをparent
オブジェクトに分散できますか?(できればNinjectを使用)common
child
質問3
これは私の問題についてもう少し一般的です:依存性注入をこのモデルに正しく適用するにはどうすればよいですか?
注:NinjectのObjectFactory.GetInstance
呼び出しKernel.Get