我正在做一个有以下情况的应用程序:
我有几个规则(商务舱)
它们都返回客户端代码。它们是单独的类,如果发现客户端代码返回了代码,它们将查找代码反复试验等等。
如何在不调用包含特定业务规则的其他IF或线程IF的类的情况下使用规则?
对于特定的类,我使用了设计模式策略。
EX:主舱
public abstract class Geral
{
public abstract string retornaCodigo(Arquivo cliente)
{
var codigo = ""; // logica
return codigo;
}
}
public class derivada1 : Geral
{
public override string retornaCodigo(Arquivo cliente)
{
var codigo = ""; // logica
return codigo;
}
}
public class derivada2 : Geral
{
public override string retornaCodigo(Arquivo cliente)
{
var codigo = ""; // logica 2
return codigo;
}
}
public class derivada3 : Geral
{
public override string retornaCodigo(Arquivo cliente)
{
var codigo = ""; // logica 3
return codigo ;
}
}
public class Negocio
{
public string Codigo()
{
var arquivo = new Arquivo();
var derivada1 = new derivada1().retornaCodigo(arquivo);
var derivada2 = new derivada2().retornaCodigo(arquivo);
var derivada3 = new derivada3().retornaCodigo(arquivo);
if (derivada1.Equals(null))
return derivada1;
if (derivada2.Equals(null))
return derivada2;
if (derivada3.Equals(null))
return derivada3;
return "";
}
}
我想要什么,而不必在Business类中使用Ifs进行验证,是否可以找到在任何条件下都可以使用的代码给出了3个类的示例,并且我有超过15个条件并且可以增加,情况可能会很多。
答案 0 :(得分:0)
您可以创建一个派生列表,然后对其进行迭代
如果给定的任何derivada1等于None,则只需返回它,否则继续执行“ for循环”
如果这对您没有意义,我可以写一个代码段。 lmk!
答案 1 :(得分:0)
这对于Linq来说很简单:
public class Negocio
{
public string Codigo()
{
var arquivo = new Arquivo();
var derivadaList = new List<Geral>() {
new derivada1(),
new derivada2(),
new derivada3(),
};
return derivadaList.FirstOrDefault(d => d.retornaCodigo(arquivo) == null)?.retornaCodigo(arquivo) ?? "";
}
}
您可以根据需要向Geral
添加任意数量的derivadaList
派生类,并且代码将继续按设计运行。
这里发生的是FirstOrDefault
将在每个元素上运行Lamda表达式,并返回第一个等于null
的元素(尽管我不确定这不是您想要的,但它与您的示例匹配码)。由于它返回一个Geral
对象,因此仅当它不为null时,才需要对其调用retornaCodigo
。如果为空,则返回一个空字符串。
另一种写法是:
public class Negocio
{
public string Codigo()
{
var arquivo = new Arquivo();
var derivadaList = new List<Geral>() {
new derivada1(),
new derivada2(),
new derivada3(),
};
foreach (var derivada in derivadaList)
{
var result = derivada.retornaCodigo(arquivo);
if (result == null)
return result;
}
return "";
}
}
答案 2 :(得分:0)
让我们将所有derivada
组织到一个集合中,例如数组,然后在 Linq < / p>
public string Codigo() {
var arquivo = new Arquivo();
Geral[] derivadas = new [] {
new derivada1(),
new derivada2(),
new derivada3();
};
//TODO: check the the condition: I guessed that you want to return first meanful codigo
foreach (var codigo in derivadas.Select(geral => geral.retornaCodigo(arquivo)))
if (!string.IsNullOrEmpty(codigo))
return codigo;
return "";
}
如果您有很多derivada
,则可以尝试使用 Reflection 来创建集合:
using System.Reflection;
...
private static Geral[] s_Derivadas = AppDomain
.CurrentDomain
.GetAssemblies() // scan assemblies
.SelectMany(asm => asm.GetTypes()) // types within them
.Where(t => !t.IsAbstract) // type is not abstract
.Where(t => typeof(Geral).IsAssignableFrom(t)) // type derived from Geral
.Where(t => t.GetConstructor(Type.EmptyTypes) != null) // has default constructor
.Select(t => Activator.CreateInstance(t) as Geral) // create type's instance
.ToArray(); // materialized as array
然后
public string Codigo() {
var arquivo = new Arquivo();
foreach (var codigo in s_Derivadas.Select(geral => geral.retornaCodigo(arquivo)))
if (!string.IsNullOrEmpty(codigo))
return codigo;
return "";
}
答案 3 :(得分:0)
您还可以使用派生类的列表并在循环中调用它们
public string Codigo()
{
var arquivo = new Arquivo();
List<Geral> gerals=new List<Geral>();
gerals.Add(new derivada1());
gerals.Add(new derivada2());
........
...........
foreach(Geral g in gerals)
{
var val=g.retornaCodigo(arquivo);
if(val!=null)
return val;
}
return "";
}
这是一个示例实现,但是您没有正确使用策略
更好的方法是构造函数注入
public string Codigo(Geral implementar)
{
var val=geral.retornaCodigo(arquivo);
return "";
}
然后仅使用所选策略实例化。
否则,如果您要链接多个验证,请使用责任模式CHain。