2010-10-13 41 views
0

在執行ValidatorFactory.CreateInstance調用期間,我收到'未註冊的錯誤'。看來發送到方法中的類型是正確的。在MVC2中使用FluentValidation的Autofac

我的註冊代碼:

... 
builder.RegisterAssemblyTypes(assembly).Where(t => t.Name.EndsWith("Validator")).As<IValidator>(); 
builder.Register(d => _containerProvider).As<IContainerProvider>(); 
builder.Register(d => new ValidatorFactory(_containerProvider.ApplicationContainer.Resolve<IContainerProvider>())).As<IValidatorFactory>(); 

_containerProvider = new ContainerProvider(builder.Build()); 

我ValidatorFactory代碼:

public class ValidatorFactory : ValidatorFactoryBase { 
    private readonly IContainerProvider _containerProvider; 

    public ValidatorFactory(IContainerProvider containerProvider) { 
     _containerProvider = containerProvider; 
    } 

    public override IValidator CreateInstance(Type validatorType) { 
     return _containerProvider.ApplicationContainer.Resolve<IValidator>(validatorType); 
    } 
} 

我的視圖模型和驗證碼:

[Validator(typeof(EmployeeViewModelValidator))] 
public class EmployeeViewModel { 
    public EmployeeViewModel() {} 
    public EmployeeViewModel(string firstName) { 
     FirstName = firstName; 
    } 

    public string FirstName { get; private set; } 
} 

public class EmployeeViewModelValidator : AbstractValidator<EmployeeViewModel> { 
    public EmployeeViewModelValidator() { 
     RuleFor(x => x.FirstName) 
      .NotEmpty(); 
    } 
} 

我最好的猜測是,我註冊驗證器錯誤。

回答

0

當前的註冊代碼:

builder.RegisterType<EmployeeViewModelValidator>().Keyed<IValidator>(typeof(EmployeeViewModel)); 
builder.RegisterType<ValidatorFactory>().As<IValidatorFactory>(); 

_containerProvider = new ContainerProvider(builder.Build()); 

當前ValidatorFactory:

public class ValidatorFactory : ValidatorFactoryBase { 
    readonly IIndex<Type, IValidator> _validators; 

    public ValidatorFactory(IIndex<Type, IValidator> validators) { 
     _validators = validators; 
    } 

    public override IValidator CreateInstance(Type validatorType) { 
     return _validators[validatorType]; 
    } 
} 

內的CreateInstance同樣的錯誤:

請求的服務'FluentValidation.IValidator`1 [.EmployeeViewModel](FluentValidation.IValidator)'沒有已被註冊。

+0

在你的註冊中,我相信它應該是'typeof(EmployeeViewModelValidator)',因爲這將是傳遞給'CreateInstance'的類型 – 2010-10-14 04:47:56

1

要從多個實現IValidator的類中解析出來,​​顯示了一些技巧。我不認爲你可以使用這些方法進行程序集掃描;您將分別註冊驗證器。

通過名稱

builder.RegisterType<EmployeeViewModelValidator>().Named<IValidator>("employee"); 

var r = container.Resolve<IValidator>("employee"); 

通過重點

文檔顯示被用作鍵的枚舉,但你可以使用類型爲關鍵,這將讓你打電話ResolveCreateInstance方法中使用validatorType傳遞給您。

builder.RegisterType<EmployeeViewModelValidator>().Keyed<IValidator>(typeof(EmployeeViewModelValidator));  

var r = container.Resolve<IValidator>(validatorType); 

注意:該文檔適用於Autofac版本2.3。我正在使用2.2.4,這就是爲什麼上面的方法名稱與文檔不同。

希望這會有所幫助。

+0

名稱更改的原因反映在此場景中 - 「解析(validatorType)」是誤導性的,因爲「validatorType」是一個鍵而不是服務類型。因此在2.3這是'ResolveKeyed (validatorType)':) ...很好的答案! – 2010-10-13 21:48:58

+0

@Nicholas Blumhardt,謝謝你爲Autofac :) – 2010-10-13 22:10:08

+0

感謝您的迴應!看到我下面仍然出錯。 – Mike 2010-10-14 00:56:03

1

@adrift的其他答案是一個很好的乾淨方法。

public class ValidatorFactory : ValidatorFactoryBase { 
    readonly IIndex<Type, IValidator> _validators; 

    public ValidatorFactory(IIndex<Type, IValidator> validators) { 
     _validators = validators; 
    } 

    public override IValidator CreateInstance(Type validatorType) { 
     return _validators[validatorType]; 
    } 
} 

重要提示:我想補充一些注意事項,這也與IIndex<K,V>關係類型,這Autofac自動提供,如工作不組件使用IContainerProviderApplicationContainer —改用IComponentContextIIndex<K,V>如上。這將有助於防止壽命的問題(你的例子與應用程序,而不是請求壽命關聯驗證。)

+0

感謝您的迴應!看到我下面仍然出錯。 – Mike 2010-10-14 00:55:42