2017-04-12 44 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