我有一个ValidationAttribute看起来像这样:
public class RegistrationUniqueNameAttribute : ValidationAttribute
{
public IRepository<User> UserRepository { get; set; }
public override bool IsValid(object value)
{
//use UserRepository here....
}
}
在我的容器设置中(在应用启动时),我有以下内容:
builder.Register(c => new RegistrationUniqueEmailAttribute
{
UserRepository = c.Resolve<IRepository<User>>()
});
但是,在调试时,UserRepository的值始终为null,因此不会注入该属性。
我的容器设置有误吗?
我真的不想使用
DependencyResolver.Current.GetService<IRepository<User>>()
,因为这不是可测试的... 最佳答案
不,Autofac v3对ValidationAttribute
和朋友[[cc>做很多强大的事情,例如,使用过滤器属性]没什么特别的事情。
我间接地in this answer解决了这个问题,使它可以编写:
class MyModel
{
...
[Required, StringLength(42)]
[ValidatorService(typeof(MyDiDependentValidator), ErrorMessage = "It's simply unacceptable")]
public string MyProperty { get; set; }
....
}
public class MyDiDependentValidator : Validator<MyModel>
{
readonly IUnitOfWork _iLoveWrappingStuff;
public MyDiDependentValidator(IUnitOfWork iLoveWrappingStuff)
{
_iLoveWrappingStuff = iLoveWrappingStuff;
}
protected override bool IsValid(MyModel instance, object value)
{
var attempted = (string)value;
return _iLoveWrappingStuff.SaysCanHazCheez(instance, attempted);
}
}
(以及一些帮助程序类,它们连接到ASP.NET MVC ...)
关于inversion-of-control - 具有ValidationAttribute的Autofac属性注入(inject),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15879967/