で名前付きインスタンスをマップするために多分これは簡単ですが、インターネット上でそれを検索することは、すでにここに私城ウィンザー - どのようにコンストラクタ・インジェクション
を頭の痛みを与えることが問題である:
interface IValidator
{
void Validate(object obj);
}
public class ValidatorA : IValidator
{
public void Validate(object obj) { }
}
public class ValidatorB : IValidator
{
public void Validate(object obj) { }
}
interface IClassA { }
interface IClassB { }
public class MyBaseClass
{
protected IValidator validator;
public void Validate()
{
validator.Validate(this);
}
}
public class ClassA : MyBaseClass, IClassA
{
//problem: validator should ValidatorA
public ClassA(IValidator validator) { }
}
public class ClassB : MyBaseClass, IClassB
{
//problem: validator should ValidatorB
public ClassB(IValidator validator) { }
}
public class OtherClass
{
public OtherClass(IClassA a, IClassB b) { }
}
//on Main
var oc = container.Resolve<OtherClass>();
任意のアイデア?私は、Named
と城ウィンザーはClassA
とClassB
にそれらのバリデータを適切に注入することができるか、今の問題をValidatorA
とValidatorB
を登録
EDIT、それを行う方法はありますか?それとももっと良い解決策がありますか?
私のクラスデザインが間違っていると思う人は、私に助言をしてください。これまでのところ私はそれが正しいと思います。はい、バリデーターは特定のクラスに対して特定の構成を持っています。
- Validatorは複雑なオブジェクトであり、データベースに接続する必要があります。したがって、ユニットテストの理由から、コンストラクタの代わりにインターフェイスを渡す必要があります。
- 私が使用する唯一の方法は
Validate
- あるので、バリのいずれかに異なるインターフェースを使用する方法私は
MyBaseClass.Validate()
共通テンプレートメソッドパターンがそれではないと思いますか?
問題の説明は要約です。 –
ClassAがIValidatorの特定の実装を必要とする場合、インタフェースは有用な抽象化を提供しないので、設計は間違っています。 –
@Jacek Grogon、いいえ、私は 'Validate'メソッドしか必要としません。実際には' Validate'メソッドを呼び出すClassAとClassBのベースクラスがあります。複雑さを隠すためにここに書きません。 – ktutnik