2017-03-23 9 views
1

私は以下の閉鎖一般登録をしています。エンティティの名前が 'Order'である場合、登録のインスタンス(OrderValidator)を取得するにはどうすればよいですか。Simple Injectorを使用して閉じたジェネリック登録の名前またはタイプでインスタンスを取得するにはどうすればよいですか?

container.Register<IValidate<Customer>, CustomerValidator>(); 
container.Register<IValidate<Employee>, EmployeeValidator>(); 
container.Register<IValidate<Order>, OrderValidator>(); 
container.Register<IValidate<Product>, ProductValidator>(); 

void GetValidator(Container container, string entityName, Entity entity) 
{ 
    // TODO: Get the Validator from container 
    validator.Validate(entity); 
} 

これ以上インターフェイスを作成しないようにしてください。

+1

注:あなたも簡素化するために、[一括登録](https://simpleinjector.readthedocs.io/en/latest/advanced.html#batch-registration)を使用することができます登録。 – Steven

答えて

1

実際にEntityが有効であることを確認しているので、型を使用してIValidator<T>型をクローズし、それを使用して必要な実装を解決します。リフレクションまたはリフレクションのラッパーであるタイプ入力を使用すると、指定されたエンティティでこのバリデーターを呼び出すことができます。ここで

は例です:

void GetValidator(Container container, string entityName, Entity entity) 
{ 
    Type validatorType = typeof(IValidator<>).MakeGenericType(entity.GetType()); 
    dynamic validator = container.GetInstance(validatorType); 
    validator.Validate((dynamic)entity); 
} 
関連する問題