我在应用程序架构中遇到了障碍.我刚刚开始使用访问者模式在抽象对象上执行特定的算法,这些抽象对象在运行时我不知道.我的问题是我的算法也取决于嵌套抽象类型的类型.
我有一个抽象的DataSource类.从这里我实现了concerete DataSourceReference和DataSourceExplicit类.我还有一个抽象的Report类(反序列化的元数据),我从中实现具体的Report类ReportTypeA和ReportTypeB.创建这些对象时,它们的DataSource可以是任何扩展的DataSource类.
我需要两者,实际的Report类型和DataSource类型,所以我可以相应地执行.我可以使用访问者模式获取协同报告类型,但不知道如何在之后/也为DataSource执行相同操作.
访问报告后我无法访问DataSource,因为我将失去报告的具体类型(因为您必须让它接受基本报告类型:Accept(SomeDataSourceVisitor d,MetaReport m) - 或者为每个可能的报告类型重载,这违背了访客模式的目的.看到我的问题?
有任何想法吗?我不想使用动态,因为它不需要新报表类型的开发人员确保调度程序(访问者)支持新报表.
public abstract class DataSource
{
}
public class DataSourceReference : DataSource
{
// reference thing(s)
}
public class DataSourceExplicit : DataSource
{
// explicit thing(s)
}
public abstract class Report
{
// some shared Report attribute(s)
// ...
public DataSource DataSource { get; set; }
public abstract FinalReport Execute(IReportExecutionDispatcher d);
}
public class ReportA : Report
{
// ReportA specific attribute(s)
// ... …
Run Code Online (Sandbox Code Playgroud) architecture abstraction multiple-dispatch double-dispatch visitor-pattern
与将逗号分隔的查询参数字符串绑定到这些逗号标记值的数组相比,这是一个更复杂的场景。
基本上我有一个名为 User 的简单实体模型:
public class User
{
public string Name { get; set }
public int Age { get; set; }
// rest ommited
}
Run Code Online (Sandbox Code Playgroud)
我希望能够在我的 Web api 端点中提供多个姓名和年龄,如下所示:
http://localhost/api/data/user/query?name=chris,john,alex&age=28,35
Run Code Online (Sandbox Code Playgroud)
它将绑定到用户过滤器的数组(我只是使用实体模型)。Swagger 还会显示测试输入表单,就像您正在输入的单个用户字段一样。
如何使用 AspDotNetCore 2.0 Web Api 和 Swashbucke 来完成此操作,而无需使用字符串创建新模型并在逗号上标记化。我很想创建某种 Swashbuckle/AspNetCore 挂钩(用某些属性装饰方法参数),然后它知道将输入拆分为单独的模型。
我的想法是生成过滤器 Expression>,用于使用过滤器值的集合过滤存储库中的数据:
var exampleExpression = entity => (entity.Name.Contains("chris") || entity.Name.Contains("john") || entity.Name.Contains("alex")) && (entity.Age == 28 || entity.Age == 35);
Run Code Online (Sandbox Code Playgroud)
我可以以编程方式生成表达式树。
我什至考虑了在生成过滤器表达式时获取输入并将其放入字典中进行查找的想法。但我很想听听您的想法和解决方案。