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

관련 문제