如果我有一个控制器可以接收和处理用户选择的操作,然后要使用另一个控制器来存储所有与数据库相关的逻辑,那么在允许第二个控制器与之交互的同时,连接这些控制器的正确方法是什么?数据库上下文。
目前,我可以在第一个控制器中创建数据库上下文,然后在使用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;
}
}
}
startup.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; }
}
答案 0 :(得分:1)
“正确”的方法是:您没有。一个控制器绝对不能直接调用另一个控制器。您可以重定向到映射到其他控制器的新路由,仅此而已。如果您有一些需要共享的通用逻辑,则应将其分解为两个控制器可以利用的完全不同的类。
答案 1 :(得分:1)
如果发现需要从另一个Controller调用Controller方法,则可能需要重构代码。控制器中应该只有很少的逻辑,通常只涉及调用服务层,然后根据数据构造ViewModel。
我的建议是对Service Layer pattern和Repository pattern(有时称为Manager模式)进行一些阅读。