2017-04-12 15 views
1

私はバリデータインスタンスを作成するファクトリを持っています。検証するオブジェクトを渡し、検証するために使用できるバリデータを提供します。コンテナに依存せずにインスタンスを解決するAutofacファクトリ

public class ValidatorFactory : IValidatorFactory 
{ 


    public ValidatorFactory(IComponentContext container) { _container = container; } 
    private readonly IComponentContext _container; 


    public IValidator create(object objectToValidate) 
    { 
    var validatorType = typeof(IValidator<>).MakeGenericType(new Type[] { objectToValidate.GetType() }); 

    object validator; 
    _container.TryResolve(validatorType, out validator); 

    return validator as EntityValidatorI; 
    } 


} 

これは動作しますが、私はコンテナIComponentContextを渡す必要があります。

私はそれを行う必要がないより良い方法はありますか?

Autofacには"Implicit Relationship Types"がありますが、タイプは実行時にしか分かりませんので、ここでどのように使用するかは分かりません。

答えて

1

あなたは以下のような何かを行うことができ、 代わりに、メインクラスにIComponentContextを注入する、ジェネリック Func方法を注入。
私はすぐにここに書きましたので、以下のコードはコンパイルされないかもしれませんが、あなたがそのアイデアを得ることを願っています。 "パラメータ化されたインスタンス" を用い

public class ValidatorFactory : IValidatorFactory 
{ 
    public ValidatorFactory(Func<Type, IValidator> factory) { _factory = factory; } 
    private readonly Func<Type, IValidator> _factory; 


    public IValidator create(object objectToValidate) 
    { 
    var validatorType = typeof(IValidator<>).MakeGenericType(new Type[] { objectToValidate.GetType() }); 

    return _factory(validatorType); 
    } 
} 

public static class YourBootstrapperClass{ 

    public static void Register(ContainerBuilder containerBuilder){ 

     containerBuilder.Register(ctx => new ValidatorFactory(type => { 
       object validator; 
       containerBuilder.TryResolve(validatorType, out validator); 
       return validator; 
     })).As<IValidatorFactory>(); 
    } 
} 
+0

[ "自動生成工場" の参照](https://autofac.readthedocs.io/en/latest/resolve/relationships.html#parameterized-instantiation-func-x-y-b) – grokky

関連する問題