c# - 应该如何在 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)
{
...
}
}
}
是否有关于如何设置它以便在模型中发生业务逻辑的参考?
解决方案
当涉及到 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 已经在内部实现了存储库模式。
推荐阅读
- angular - 如何检测角度 6 中打字稿对象的变化
- c# - 内存流关闭?
- css - 动画:未应用不透明度属性
- angular-material2 - 如何将 angular-fontawesome 与 Angular Material 一起使用?
- c++ - 写入文件时出现分段错误
- python - Python:将列名作为变量添加到mysql表
- angular - Angular HTTP 调用不会触发?没发生什么事
- java - JUnit 5,如何从 BeforeEach 回调中获取参数化的测试参数?
- python - 如何模拟使用更少 RAM 的列表理解?
- java - 使用随机 Java 时出现 nullPointerException