asp.net-mvc – 应用程序服务层作为静态类

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – 应用程序服务层作为静态类前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的ASP.NET MVC应用程序中,我有一个包含所有业务逻辑/服务层的项目.该项目与我的数据库(实体框架)进行交互,该框架位于单独的项目中.

我想要轻松访问服务层,所以我创建了静态类,所以它们可以很容易地被引用.例如,如果我在我的控制器,我需要创建一个新的帐户:

  1. ServiceLayer.Accounts.CreateAccount(userName,passWord) //etc..

然后,服务层执行所有必需的逻辑,然后通过DatabaseLayer中的存储库创建用户.

  1. private static AllRepos _Repos;
  2. private static AllRepos Repos {
  3. get
  4. {
  5. if(_Repos == null)
  6. _Repos = new AllRepos();
  7.  
  8. return _Repos
  9. }
  10. }
  11.  
  12. public static void CreateAccount(string username,password)
  13. {
  14. string salt = GenerateSalt();
  15. Account newAccount = DatabaseLayer.Models.Account
  16. {
  17. Name = username,Password = HashPassword(password,salt),Salt = salt
  18. };
  19. Repos.AddAccount(newAccount);
  20. }

因为我不想在我的服务层中做各种各样的事情:

  1. AccountRepository Accounts = new DatabaseLayer.AccountRepository();

我为我的存储库创建了一个包装类,所以我只需要实例化一次以使用所有其他的存储库.

  1. public class AllRepos
  2. {
  3.  
  4. private AccountRepository _Accounts;
  5.  
  6. public AccountRepository Accounts
  7. {
  8. get
  9. {
  10. if (_Accounts== null)
  11. _Accounts= new AccountRepository();
  12.  
  13. return _Accounts;
  14. }
  15. }
  16.  
  17. // the same is done for every other repository (currently have about 10+)
  18. }

这在服务层的静态类中使用.

因为我所有的服务层类都是静态的,而且Repos字段也是静态的,所以我遇到的一个明显的问题是从多个数据文件中检索到相同的对象,从而导致更新/删除的奇怪行为.

我明白这是预期的,如果我使用静态成员/类,就像我上次使用应用程序的生命周期一样,但是有没有办法能够使用服务层作为ServiceLayer.Accounts.Method()而没有创建一个非静态类,需要在其使用的任何地方进行实例化,并且由于多个数据文本实例而不会遇到CRUD问题?

解决方法

你的方法真的不是推荐的.就我个人而言,我绝对不会允许我的团队采用这种方式.缺点:

主要的线程问题,正如你所经历的,这不是很简单的解决
>你根本不能很容易地测试.
>您的数据访问不现实的抽象

创建存储库实例的最大原因是,如果需要,可以注入依赖项.最着名的参数是单元测试,所以你可以模拟依赖,但是我已经建立了一些存储库,这些存储库具有更改生产代码的接口依赖关系.

您应该只是将存储库实例化作为基础服务类的一部分.没有理由必须是“静态OR实例调用无处不在”.基类内部应该有有限的实例化实例化代码.

猜你在找的asp.Net相关文章