Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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# 多策略设计模式_C#_Asp.net Mvc_Validation_Design Patterns_Strategy Pattern - Fatal编程技术网

C# 多策略设计模式

C# 多策略设计模式,c#,asp.net-mvc,validation,design-patterns,strategy-pattern,C#,Asp.net Mvc,Validation,Design Patterns,Strategy Pattern,我希望能够收集多个验证实体,它们共享同一个接口。这就是我想到的: public interface Ivalidateable { bool IsValid(IValidateParam param); } public interface IValidateParam { } public abstract EmployeeStrategy: Ivalidateable { public abstract bool IsValid(User user); } public a

我希望能够收集多个验证实体,它们共享同一个接口。这就是我想到的:

public interface Ivalidateable
{
  bool IsValid(IValidateParam param);
}

public interface IValidateParam
{

}

public abstract EmployeeStrategy: Ivalidateable
{
  public abstract bool IsValid(User user); 
}

public abstract SpreadStrategy: IValidateable
{
 public abstract bool IsAvlid(Campaign campaign);
}

public class User: IValidateParam
{}

public class Campaign: IValidateParam
{}

public EmployeeTypeStragtegy: EmployeeStrategy, IValidateable
{
 public bool IsValid(User user)
 {
  if  (new[]{'e',a','b}.Contains(user.userId.first().toString()))
  return true;

  return false; 
 }
}

public TrailSpreadStrategy: SpreadStrategy, IValidateable
{
 public bool IsValid(Campaign campaign)
 {
  //logic goes here
 }
}

public EvenpreadStrategy: SpreadStrategy:, IValidateable
{
 public bool IsValid(Campaign campaign)
 {
  //logic goes here
 }
}

public class ValidationFactory
{
 private static List<IValidateable> stragtegies;

 static ValidationFactory
 {
  strategies = new List<IValidateable>();
  strategies.Add(new EmployeeTypeStragtegy());
  strategies.Add(new TrailSpreadStrategy());
 }

 public bool IsValid(//Need to pass User/Campaign)
 {
  //what do I do here?
 }
}
公共接口不可替代
{
bool是有效的(IValidateParam参数);
}
公共接口IValidateParam
{
}
公开摘要雇员策略:无可匹敌
{
公共摘要bool是有效的(用户);
}
公共抽象传播策略:无可匹敌
{
公共摘要布尔·伊萨维利德(运动);
}
公共类用户:IValidateParam
{}
公共课活动:IValidateParam
{}
公共员工类型战略:员工战略,可竞争
{
公共bool有效(用户)
{
if(new[]{'e',a','b}.Contains(user.userId.first().toString()))
返回true;
返回false;
}
}
公共交通线扩张战略:扩张战略,无可匹敌
{
公共bool有效(活动)
{
//逻辑就在这里
}
}
公共广告策略:传播策略:,无可匹敌
{
公共bool有效(活动)
{
//逻辑就在这里
}
}
公共类验证工厂
{
私有静态列表策略;
静态验证工厂
{
策略=新列表();
添加(新员工类型战略());
添加(新的TrailSpreadStrategy());
}
公共bool有效(//需要通过用户/活动)
{
//我在这里干什么?
}
}
传递用户/活动的最佳方式是什么,这样我可以循环策略并检查是否有效?

这个怎么样

更改您的所有IsValid以使用此原型(用户、活动),例如:

public EmployeeTypeStragtegy: EmployeeStrategy, IValidateable
{
 public bool IsValid(User user, Campaign campaign)
 {
    return (new char[]{'e','a','b'}.Contains(user.userId.first().toString());
 }
}
然后通过适当的类型处理每个,这样它们都接受相同的参数。然后:

public bool IsValid(User user, Campaign campaign)
 {
   bool valid;

   foreach (IValidateable iv in strategies)
   {
      if (!iv.IsValid(user, campaign))
          valid = false;
   }

   // This returns true if all are valid, false if not (not sure if this is the logic you expect)
   return valid;
 }

我建议您看看的嵌套和集合验证功能。如果您的策略包含了对其他实体的引用,那么在没有额外工厂和接口的情况下,这应该可以正常工作。

我将这样做:

// campaign object class, and it's separate validator logic

public class Campaign
{
}

public class CampaignValidator : IValidationStrategy<Campaign>
{
    public bool IsValid(Campaign test)
    {
        return true;
    }
}

// framework stuff

public interface IValidationStrategy<T>
{
    bool IsValid(T test);
}

public static class ValidationFactory
{
    private readonly static Dictionary<Type, object> _typeValidators;

    static ValidationFactory()
    {
        _typeValidators = new Dictionary<Type, object>();
        _typeValidators[typeof(Campaign)] = new CampaignValidator();
    }

    public static bool IsValid<T>(T obj)
    {
        return ((IValidationStrategy<T>)_typeValidators[typeof(T)]).IsValid(obj);
    }
}
//活动对象类,它是独立的验证程序逻辑
公课运动
{
}
公共类活动验证程序:IValidationStrategy
{
公共bool有效(活动测试)
{
返回true;
}
}
//框架材料
公共界面竞争策略
{
bool有效(T检验);
}
公共静态类验证工厂
{
私有只读静态字典_类型验证器;
静态验证工厂()
{
_typeValidators=新字典();
_typeValidators[typeof(活动)]=新的活动验证器();
}
公共静态布尔值有效(T obj)
{
返回((IValidationStrategy)u typeValidators[typeof(T)]).IsValid(obj);
}
}
之后,您可以调用
ValidationFactory.IsValid(myObject)
验证工厂正在做一种DI/IOC工作,即您可以使用Ninject、Castle等来实现类型到验证程序类型的映射

您可以动态地或以不同的方式进行操作,而不必以相同的方式构建字典-查看验证器实现的接口的泛型类型参数,或者搜索基于
IValidationStrategy
的类,然后再次查看泛型类型参数。但是上面的方法简单快捷


是否有理由需要单独的验证程序类?

您有两种验证活动的策略,都将执行,或者是否有一些标准来选择正确的一种?每种类型(用户/活动)只有一种…我只是想展示声明不止一个的想法我想做这样的事情:public bool IsValid(用户,活动){return strategies.All(s=>s.IsValid(//?)}因此,您希望提供1个用户和1个活动,并循环所有策略,以查看它们是否适用于任何一种策略,具体取决于类型?确切地说是crlangois!!!如果策略基于员工,它将使用用户,如果是SpreadStrategy,它将使用活动我想将它们分开,因为每个对象都有一个不同的对象来验证是的,我看到了,但为什么不在每个对象本身上包含一个IsValid呢?:)我认为我领会你的意思了。谢谢我想循环遍历它们,并调用IsValid for every Strategy,这就是为什么我的字典策略对每个策略都有效。顺便问一下,我如何使用工厂的IsValid中的循环来验证所有字典策略,使用您的建议?