Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.Net MVC 4自定义验证属性依赖项注入_C#_Asp.net_Asp.net Mvc_Unit Testing_Dependency Injection - Fatal编程技术网

C# ASP.Net MVC 4自定义验证属性依赖项注入

C# ASP.Net MVC 4自定义验证属性依赖项注入,c#,asp.net,asp.net-mvc,unit-testing,dependency-injection,C#,Asp.net,Asp.net Mvc,Unit Testing,Dependency Injection,在我目前正在开发的ASP.NETMVC4应用程序中,有许多具有仓库属性的模型。我希望所有这些模型都进行验证,以确保输入的仓库是有效的仓库。看起来最简单的方法是使用自定义ValidationAttribute类。然后验证代码将被集中化,我可以在每个模型中将属性添加到属性中 我需要打电话给服务人员以确保仓库是有效的仓库。我有一个表示此服务的接口,我正在使用Ninject在使用此服务的应用程序中进行依赖项注入。这样我就可以使用mocking并轻松地对应用程序进行单元测试 我希望我的自定义Validat

在我目前正在开发的ASP.NETMVC4应用程序中,有许多具有仓库属性的模型。我希望所有这些模型都进行验证,以确保输入的仓库是有效的仓库。看起来最简单的方法是使用自定义ValidationAttribute类。然后验证代码将被集中化,我可以在每个模型中将属性添加到属性中

我需要打电话给服务人员以确保仓库是有效的仓库。我有一个表示此服务的接口,我正在使用Ninject在使用此服务的应用程序中进行依赖项注入。这样我就可以使用mocking并轻松地对应用程序进行单元测试

我希望我的自定义ValidationAttribute类在使用此服务时使用依赖项注入。下面是我创建的类:

public class MustBeValidWarehouse : ValidationAttribute
{
  public override bool IsValid(object value)
  {
    if (value is string)
    {
      string warehouse = value.ToString();
      NinjectDependencyResolver depres = new NinjectDependencyResolver();
      Type inventServiceType = typeof(IInventService);
      IInventService inventserv = depres.GetService(inventServiceType) as IInventService;
      return (inventserv.GetWarehouses().Where(m => m.WarehouseId == warehouse).Count() != 0);

    }
    else
    {
      return false;
    }
  }
}


public class NinjectDependencyResolver : IDependencyResolver
{
    private IKernel kernel;
    public NinjectDependencyResolver()
    {
        kernel = new StandardKernel();
        AddBindings();
    }

    public object GetService(Type serviceType)
    {
        return kernel.TryGet(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return kernel.GetAll(serviceType);
    }

    private void AddBindings()
    {
        kernel.Bind<IInventService>().To<InventService>();
    }
}
公共类必须是有效的电子邮件地址:ValidationAttribute
{
公共覆盖布尔值有效(对象值)
{
if(值为字符串)
{
字符串warehouse=value.ToString();
NinjectDependencyResolver depress=新的NinjectDependencyResolver();
类型inventServiceType=typeof(IIInventService);
IIInventService inventserv=depress.GetService(inventServiceType)作为IIInventService;
返回(inventserv.GetWarehouses().Where(m=>m.WarehouseId==warehouse.Count()!=0);
}
其他的
{
返回false;
}
}
}
公共类NinjectDependencyResolver:IDependencyResolver
{
私有IKernel内核;
公共NinjectDependencyResolver()
{
内核=新的标准内核();
AddBindings();
}
公共对象GetService(类型serviceType)
{
返回kernel.TryGet(serviceType);
}
公共IEnumerable GetServices(类型serviceType)
{
返回kernel.GetAll(serviceType);
}
私有void AddBindings()
{
kernel.Bind().To();
}
}
依赖项注入工作正常,但是不容易测试。在单元测试中,无法将模拟IIInventService注入到类中。通常为了解决这个问题,我会让类构造函数接受一个IInventService参数,这样我就可以在单元测试中传入一个模拟对象。但是,我不认为我可以让这个类构造函数将IIInventService类作为参数,因为我认为当我在类中添加这个属性时,我必须传入该参数


有没有办法使这段代码更易于测试?如果没有,那么有更好的方法吗?

您需要在ASP.NET MVC中使用
DependencyResolver
类。如果正确连接容器,则依赖项解析程序。当前的将使用容器解析依赖项

public class MustBeValidWarehouse : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        if (value is string)
        {
            string warehouse = value.ToString();
            IInventService inventserv = DependencyResolver.Current.GetService<IInventService>();
            return (inventserv.GetWarehouses().Where(m => m.WarehouseId == warehouse).Count() != 0);
        }
        return false;
    }
}

提出得很好的问题。读起来真高兴!
DependencyResolver.SetResolver(resolverMock);