こんにちは 私はいくつかの条件チェックを含むメソッドを持ち、条件に従って文字列を追加するクラスを持っています。抽象的な工場パターンでこのコードをリファクタリングしようとしました。抽象ファクトリパターンデフォルトクラスの問題
私の問題は、デフォルトの表現クラスに関連しています。関連するフィルタに他のルールが適用されない場合は、デフォルトの式ルールを適用します。しかし、私のアプリケーションでは、 _expressionsリストのStandartExpressionインスタンスの順序に依存します。最初に追加された場合、他のルールはチェックされません。
私はそのパターンについて何か忘れてしまったと思います。私たちを手伝ってくれますか?
これは私のアプリケーションコードです:
public class Filter
{
private string _operator = "="; // =, !=, <,> ...
public string Name { get; set; }
public object Value { get; set; }
public string Operator { get { return _operator; } set { _operator = value; } }
}
Filter filter = null;
StringBuilder whereClause = new StringBuilder();
for (int i = 0; i < array.Length; i++)
{
filter = array[i];
if (filter.Value.ToString().ToLower().Equals("null"))
{
whereClause.Append(filter.Name + " " + filter.Operator + " null ");
}
else if (filter.Operator.ToLower().Equals("like"))
{
whereClause.Append(filter.Name + ".Contains(@" + i + ")");
}
else
{
whereClause.Append(filter.Name + " " + filter.Operator + " @" + i);
}
whereClause.Append(" AND ");
}
さて、これはAbstract Factoryパターンコードです:
public interface ICustomExpression
{
bool ExpressionIsValid(Filter filter);
string GetExpressionStr(Filter filter, int index);
}
public class StandardExpression : ICustomExpression
{
public bool ExpressionIsValid(Filter filter)
{
return true;
}
public string GetExpressionStr(Filter filter, int index)
{
return filter.Name + " " + filter.Operator + " @" + index;
}
}
public class LikeExpression : ICustomExpression
{
public bool ExpressionIsValid(Filter filter)
{
return filter.Operator.ToLower().Equals("like");
}
public string GetExpressionStr(Filter filter, int index)
{
return filter.Name + ".Contains(@" + index + ")";
}
}
public class NullExpression : ICustomExpression
{
public bool ExpressionIsValid(Filter filter)
{
return filter.Value.ToString().ToLower().Equals("null");
}
public string GetExpressionStr(Filter filter, int index)
{
return filter.Name + " " + filter.Operator + " null ";
}
}
public static class ExpressionFactory
{
private static List<ICustomExpression> _expressions = null;
public static List<ICustomExpression> Expressions
{
get
{
if (_expressions == null)
{
Build();
}
return _expressions;
}
}
private static void Build()
{
_expressions = new List<ICustomExpression>();
_expressions.Add(new NullExpression());
_expressions.Add(new LikeExpression());
_expressions.Add(new StandardExpression());
}
}
が、それは私が私のアプリケーションコードにその構造を使用する方法です:
StringBuilder whereClause = new StringBuilder();
Filter filter = null;
var array = filterList.ToArray();
for (int i = 0; i < array.Length; i++)
{
filter = array[i];
foreach (ICustomExpression exp in ExpressionFactory.Expressions)
{
if (exp.ExpressionIsValid(filter))
whereClause.Append(exp.GetExpressionStr(filter, i));
}
whereClause.Append(" AND ");
}
これは私が探しているものです。パターンについて私が迷っているものを手に入れました。ありがとう!!! – ahmet