使用依赖关系注入连接控制器的正确方法



如果我有一个控制器接收并处理用户选择的操作,然后想使用另一个控制器来存储所有与数据库相关的逻辑,那么连接这些控制器的正确方法是什么,同时允许第二个控制器与数据库上下文进行交互。

目前,我让它在第一个控制器中创建数据库上下文,然后在使用 DI 连接两者时将其解析为数据库控制器,但希望有人可以向我展示执行此操作的正确方法。

  public class TestController : Controller
{
    private readonly DatabaseContext context;
    private Database.UserController userDatabaseController;
    public TestController(DatabaseContext db)
    {
        context = db;
        userDatabaseController = new Database.UserController(context);
    }
}

数据库控制器

public class UserController : Controller
{
    private readonly DatabaseContext context;
    public UserController(DatabaseContext ctx)
    {
        context = ctx;
    }
    public bool RegisterUser(Models.DatabaseModels.UserModel model)
    {
        try
        {
            context.Users.Add(model);
            context.SaveChanges();
            return true;
        }
        catch (Exception e)
        {
            return false;
        }
    }
}

启动.cs

  services.AddDbContext<DatabaseContext>
            (options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

数据库上下文

 public class DatabaseContext : DbContext
{
    public DatabaseContext(DbContextOptions<DatabaseContext> options)
       : base(options)
    { }
    public DbSet<DatabaseModels.UserModel> Users { get; set; }
}

"正确"的方式是:你没有。一个控制器不应直接调用另一个控制器。您可以重定向到映射到其他控制器的新路由,但仅此而已。如果你有一些需要共享的通用逻辑,那么应该将其分解到两个控制器都可以使用的完全不同的类中。

如果您发现需要从另一个控制器调用控制器方法,则可能需要重构代码。控制器中的逻辑应该很少,这通常只涉及调用服务层,然后从数据构造 ViewModel。

我的建议是阅读服务层模式和存储库模式(有时称为管理器模式(。

最新更新