在使用仓储时,ASP.NET MVC中最适合放置业务逻辑的位置是哪里?

11 浏览
0 Comments

在使用仓储时,ASP.NET MVC中最适合放置业务逻辑的位置是哪里?

在ASP.NET MVC项目中实现数据库存储库时,将业务逻辑放入其中是否正确,或者将逻辑放入控制器类可能更好?还是使用额外的服务和助手类来操作数据?

0
0 Comments

在使用存储库时,ASP.NET MVC中业务逻辑的最佳位置是什么?这个问题的出现是因为在ASP.NET MVC应用程序中,我们需要确定最佳的位置来放置业务逻辑。下面的内容给出了该问题的原因和解决方法。

在ASP.NET MVC应用程序中,业务逻辑的最佳位置是作为其自己的层(作为“模型”层的一部分)。这样做的一个折衷方案是需要封装代码。如果过于激进,可能会在实体和领域模型之间产生一些重复(如果数据库的关系语义已经处理了业务逻辑)。

视图是应用程序中最易变的部分,因为它最有可能发生变化。在视图中正确地处理业务逻辑非常困难,因为需要支持各种视图状态的转换。因此,现在很多人都知道不要在视图中处理业务逻辑。

存储库的问题在于维护和抽象的纯度。违反这一原则会使应用程序难以维护并令人困惑。存储库是一个抽象,它将数据存储呈现为包含领域对象的集合。存储库不应该包含任何领域逻辑,而是应该存在于领域对象中。如果在存储库中实现领域逻辑,将违反单一责任原则(SRP),并产生代码异味。我们可以使用更高级的领域对象来处理领域逻辑,这些领域对象可以使用存储库来进行最终的存储/检索操作,从而避免违反SRP。

控制器也不是放置业务逻辑的好地方。控制器的工作是在控制器和模型之间进行中介。模型是领域,领域就是业务逻辑。

在实体中放置领域数据可能是一个选择。但是,如果实体是已连接的,则在访问导航属性时必须小心,因为可能会触发意外的数据库查询或异常(取决于上下文是否已释放)。如果将它们分离,会破坏对象图,除非显式地将对象重新连接到上下文中。

另外,我刚刚发现了Entity Framework 4.1中的一个功能,你可能会对它感兴趣:IValidatableObject接口。你可以将实体作为局部类,并在局部类中实现该接口。当这样做时,Entity Framework将在保存时调用Validate,并在合适的时候调用Validate。这可能有助于避免在其他情况下将持久性模型与域模型分离。

最后,我建议尽量避免将实体传递回视图。这样做会在许多情况下导致错误(例如将视图状态序列化为JavaScript)并在其他情况下导致意外的数据库查询。相反,传递简单类型(字符串、整数、列表、哈希集、字典等)或构造视图模型类传递给视图。

总之,ASP.NET MVC应用程序中业务逻辑的最佳位置是作为其自己的层(作为“模型”层的一部分)。视图、存储库、控制器和实体都不适合放置业务逻辑。有一些解决方案可以帮助我们避免在不适合的地方放置业务逻辑,例如使用高级领域对象来处理领域逻辑,实现IValidatableObject接口来验证实体等。

0
0 Comments

在ASP.NET MVC中,当使用repositories时,最佳的业务逻辑放置位置是在领域模型中。这是因为领域模型是处理业务逻辑的地方。

在这个问题的解决方法中,某些情况下应该将业务逻辑放置在控制器中。然而,另一个回答指出,将业务逻辑放置在控制器中违反了单一职责原则,并且会导致代码的复杂性和重复性增加。相反,应该将业务逻辑放置在领域模型中,这样可以更好地组织和管理业务逻辑代码。

以下是一些关于将业务逻辑放置在领域模型中的解决方法:

1. 创建领域模型类:创建一个类来表示领域模型,该类应该包含处理业务逻辑的方法和属性。

2. 使用repositories:使用repositories来管理数据访问和持久化。repositories是一种将数据访问和业务逻辑分离的方法。

3. 将业务逻辑放置在领域模型方法中:将业务逻辑代码放置在领域模型的方法中,这样可以确保业务逻辑与数据访问和持久化分离。

以下是一个示例代码,展示了将业务逻辑放置在领域模型中的方法:

public class Order

{

public int Id { get; set; }

public DateTime OrderDate { get; set; }

public decimal TotalAmount { get; set; }

public void CalculateTotalAmount()

{

// Calculate the total amount based on the order items

}

public void Save()

{

// Save the order to the database

}

}

public class OrderRepository

{

public void Save(Order order)

{

// Save the order to the database

}

}

在上面的示例中,Order类是领域模型类,它包含了处理业务逻辑的方法和属性。OrderRepository类是一个repository,用于管理数据访问和持久化。

通过将业务逻辑放置在领域模型中,可以实现代码的重用性和可维护性。此外,由于业务逻辑与数据访问和持久化分离,可以更好地组织和管理代码。

总结起来,将业务逻辑放置在ASP.NET MVC中的repositories中的最佳位置是在领域模型中。这样可以实现代码的重用性和可维护性,并且可以更好地组织和管理业务逻辑代码。

0
0 Comments

在ASP.NET MVC中使用存储库时,业务逻辑的最佳位置是什么?这个问题的出现是为了解决Controller和Repository之间的分离问题。解决方法是添加一个Service层,将模型传递给Repository。在这个Service层中,可以添加与Controller对应的Service类。例如,如果使用一个UserController和User Model,可以将User Model传递给UserService类。在这里,Service层可以充当Controller和Repository之间的桥梁,以确保Controller和Repository的分离。

0