Tag: 业务逻辑

不使用ORM的N层数据库应用程序,UI如何指定数据显示的内容?

我在这里寻找指针和信息,我会做这个CW,因为我怀疑它没有一个正确答案。 这是针对C#的,因此我将在下面对Linq进行一些引用。 我也为这篇长篇大论道歉。 让我在这里总结一下这个问题,然后是完整的问题。 简介:在UI / BLL / DAL / DB 4层应用程序中,如何更改用户界面,以显示更多列(例如在网格中),避免泄漏通过业务逻辑层进入数据访问层,掌握要显示的数据(假设它已经在数据库中)。 让我们假设一个有3(4)层的分层应用程序: 用户界面(UI) 业务逻辑层(BLL) 数据访问层(DAL) 数据库(DB;第4层) 在这种情况下,DAL负责构造SQL语句并对数据库执行它们,返回数据。 “正确”构建这样一个层的唯一方法就是始终“select *”吗? 对我来说这是一个很大的禁忌,但让我解释为什么我在想。 让我们说,对于我的用户界面,我希望显示所有拥有活跃就业记录的员工。 “活跃”是指今天的就业记录包含今天(或者甚至是我可以在用户界面中设定的日期)。 在这种情况下,假设我想向所有这些人发送一封电子邮件,所以我在BLL中有一些代码可以确保我还没有向同一个人发送过电子邮件,等等。 对于BLL,它需要最少量的数据。 也许它调用数据访问层来获取活动员工列表,然后调用以获取它发送的电子邮件列表。 然后它加入这些并构造一个新列表。 也许这可以在数据访问层的帮助下完成,这并不重要。 重要的是,对于业务层,它实际上并不需要太多数据。 也许它只需要每个员工的唯一标识符,对于两个列表,匹配,然后说“这些是活动的那些的唯一标识符,您尚未发送电子邮件到”。 然后我构造DAL代码来构造只检索业务层需要的SQL语句吗? IE浏览器。 只是“SELECT id FROM employees WHERE …”? 那么我该怎么做用户界面呢? 对于用户而言,最好包含更多信息,具体取决于我想发送电子邮件的原因。 例如,我可能想要包括一些基本的联系信息,或者他们工作的部门,或者他们的经理姓名等,而不是说我至少要显示姓名和电子邮件地址信息。 用户界面如何获取该数据? 我是否更改了DAL以确保将足够的数据返回给UI? 我是否更改BLL以确保它为UI返回足够的数据? 如果从DAL返回到BLL的对象或数据结构也可以发送到UI,那么BLL可能不需要进行太多的更改,但是UI的要求会影响超出应该与之通信的层。 。 如果这两个世界在不同的数据结构上运行,则可能必须对两者进行更改。 那么当UI被更改时,为了更进一步帮助用户,通过添加更多列,我需要多深才能更改UI? (假设数据已存在于数据库中,因此不需要进行任何更改。) 提出的一个建议是使用Linq-To-SQL和IQueryable,这样如果DAL处理什么(如在什么类型的数据中)和为什么(如WHERE-clauses中)返回IQueryables,BLL可以可能会将这些内容返回到UI,然后可以构建一个Linq查询来检索所需的数据。 然后,用户界面代码可以拉入所需的列。 这可能会有效,因为使用IQuerables,UI最终会实际执行查询,然后它可以使用“select new {X,Y,Z}”来指定它需要的内容,甚至可以在必要时加入其他表。 这看起来很混乱。 […]

业务validation逻辑代码气味

请考虑以下代码: partial class OurBusinessObject { partial void OnOurPropertyChanged() { if(ValidateOurProperty(this.OurProperty) == false) { this.OurProperty = OurBusinessObject.Default.OurProperty; } } } 也就是说,当OurProperty中的OurBusinessObject的值发生更改时,如果该值无效,请将其设置为默认值。 这种模式让我感觉像代码味道,但其他人(在我的雇主)不同意。 你的想法是什么? 编辑补充 :我被要求添加一个解释为什么这被认为是好的。 我们的想法是,业务对象可以validation自己的属性,并在validation失败的情况下设置干净的默认值,而不是让业务对象的生产者validation数据。 此外,有人认为,如果validation规则发生变化,业务对象生产者将不必更改其逻辑,因为业务对象将负责validation和清理数据。

MVVM – validation

我们试图在mvvm中确定在业务逻辑或模型中进行validation的validation。 我在业务逻辑中实现了exception类型的validation – 可以在这里找到简化的图表: 如果我们有很多输入彼此独立,那么没有问题,抛出exception,文本框会抓住它,标记为每个错误输入的边框为红色。 但是,当我们有依赖值时,我们就遇到了麻烦。 例如 模型中的Value1和Value2必须不一样,所以我们在每个查找equals值的函数中都有一个validate函数,如果发生这种情况则抛出exception 现在,如果我们将Value1设置为0而将Value2设置为1,一切都很好 Value1在GUI中设置为1 – >这个被标记为红色,因为未触发其他值的validation,因此GUI中的Value2未标记为错误 在GUI中将Value2设置为2,现在我们已达到有效状态,但只有Value2得到validation,因此Value1仍被标记为有错 有没有一个共同的模式来解决这个问题? 我们不希望在两个文本框之间的GUI中引入依赖关系,因为此逻辑应仅存在于业务逻辑层中。 除了通过exception实现validation之外,还可以实现IDataErrorInfo接口,但问题仍然存在,没有办法强制依赖值再次validation它们的值,至少没有我能看到:) 任何帮助表示赞赏 欢呼,曼尼 [清理,删除不必要的步骤] 15.11.2010 – 第2部分 好的,在这里重新思考,我们将继续使用businesslogic层。 这是我们当前计划的配置: (图像在这里缩小了一点,请在单独的窗口打开以显示全尺寸)一切都或多或少都清楚,除了如果数据模型如何通知不同编辑器的所有视图模型/模型克隆在业务逻辑下变了。 一种方法是跟踪创建它们的业务逻辑中的克隆模型。 使用业务逻辑commit()更改数据模型时,可以将所有其他已注册的模型克隆通知更改并进一步传播它们。 或者,业务逻辑可以发布所有视图模型订阅的事件,以便他们也可以获得更改 – 任何人都可以给我一个提示更好的提示吗? 再次感谢您的帮助,对不起,我是如此精神错乱;)

只要有相应的“开始”呼叫,就执行“结束”呼叫

假设我想强制执行一条规则: 每次在函数中调用“StartJumping()”时,必须在返回之前调用“EndJumping()”。 当开发人员编写代码时,他们可能只是忘记调用EndSomething – 所以我想让它易于记忆。 我只能想到一种方法:它滥用“using”关键字: class Jumper : IDisposable { public Jumper() { Jumper.StartJumping(); } public void Dispose() { Jumper.EndJumping(); } public static void StartJumping() {…} public static void EndJumping() {…} } public bool SomeFunction() { // do some stuff // start jumping… using(new Jumper()) { // do more stuff // while jumping } […]

在单独的数据访问和业务逻辑层中,我可以在业务层中使用Entity框架类吗?

在单独的数据访问和业务逻辑层中,我可以在业务层中使用Entity框架类吗? 编辑:我认为将来我不需要从我的业务逻辑中换出数据访问层(即将是SQL Server),但是我将用于UI层。 因此,问题更多的是在业务层中为我使用EF类有什么主要问题吗? 好像管道代码会少一些。