2017-04-12 2 views
1

Ich habe eine Factory, die Validator-Instanzen erstellt. Ich gebe ein Objekt zur Validierung ein und es gibt mir den Validator, den ich verwenden kann, um es zu validieren.Autofac-Factory, die Instanzen ohne Abhängigkeit vom Container behebt

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; 
    } 


} 

Es funktioniert, aber ich brauche IComponentContext in den Behälter zu übergeben.

Gibt es einen besseren Weg, wo ich das nicht tun muss?

Autofac hat "Implicit Relationship Types" aber ich bin unsicher, wie man sie hier verwendet, da der Typ nur zur Laufzeit bekannt sein würde.

Antwort

1

Sie so etwas wie unten tun können, Statt IComponentContext in die Hauptklassen der Injektion injizieren eine generische Func Methode.
Der Code unten kompiliert möglicherweise nicht, wie ich es schnell hier einfach geschrieben habe, aber ich hoffe, dass Sie die Idee bekommen.

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

[Referenz für "automatisch generierte Fabrik"] (https://autofac.readthedocs.io/en/latest/resolve/relationships.html#parameterized-instantiation-func-x-y-b) "parametriert Instanziierung" mit – grokky

Verwandte Themen