首页 > 解决方案 > 应该如何在 ASP NET Core MVC 中检索数据?

问题描述

我正在开发一个 ASP NET Core MVC 项目(使用实体框架和身份,如果这对这个答案有影响的话),我对我在不同网站上阅读的所有内容感到有点困惑。有人说业务逻辑应该在模型中,但其他人则显示正在创建的 databasecontext.cs 和业务逻辑在其中。将它放在模型中对我来说很有意义,但我现在的问题是数据库是在 startup.cs 服务中设置的,所以现在选项是从服务发送的,我不能真正为每个人创建一个新连接方法调用。

以供参考:

启动.cs

services.AddDbContext<DatabaseContext>( options =>
{
     options.UseSqlServer(
          Configuration.GetConnectionString("DefaultConnection"),
          b => b.MigrationsAssembly(typeof(DatabaseContext).Assembly.FullName)
     );
});

模型 - User.cs

namespace SPPP.Models
{
    public class User : IdentityUser
    {
        [Required(ErrorMessage = "Full Name Required")]
        [MaxLength(80)]
        public string FullName { get; set; }

        [Required(ErrorMessage = "Role Required")]
        [MaxLength(10)]
        public string Role { get; set; }

        [Required(ErrorMessage = "Status Required")]
        [MaxLength(10)]
        public string Status { get; set; }

        public IList<User_Group> User_group { get; set; }

        public User()
        {

        }
    }
}

数据库上下文.cs

namespace SPPP.Data
{
    public class DatabaseContext : IdentityDbContext
    {

        public DbSet<User> Users { get; set; }
        public DbSet<Group> Groups { get; set; }
        public DbSet<File> Files { get; set; }
        public DbSet<User_Group> User_groups { get; set; }

        public DatabaseContext(DbContextOptions<DatabaseContext> options) : base(options)
        {

        }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            ...
        }
    }
}

是否有关于如何设置它以便在模型中发生业务逻辑的参考?

标签: c#asp.net-mvcasp.net-coreasp.net-mvc-3entity-framework-core

解决方案


当涉及到 ASP.NET MVC 时,您不应该在模型中执行业务逻辑。您的业​​务逻辑应保存在服务类中。尽管您可以以不同的方式构建它。这是一个常见的例子:

前任:

public class UserService : IUserService
{
    private readonly DatabaseContext _context;
    
    pubic UserService(DatabaseContext context) 
    {
        _context = context;
    }

    public async Task<User> GetUsersAsync() 
    {
        // Do some business logic here


        // Get data from DB like this:
        var users = await _context.Users.ToListAsync();

    }
}

然后,您的控制器将在构造函数中注入 IUserService。然后,您可以从控制器中的服务类调用任何方法。

不要忘记在 startup.cs ConfigureServices() 方法中注册您的服务。

如果您不想将业务逻辑与从同一位置的 dbcontext 获取数据混合在一起,您还可以将逻辑分离以在单独的类(如 DataAccess 层)中获取数据。有些人也喜欢使用存储库模式,这是可以的,但没有必要,因为默认情况下 EF 已经在内部实现了存储库模式。


推荐阅读