gpt4 book ai didi

c# - 不同领域中非常相似的 Controller 的最佳实践

转载 作者:行者123 更新时间:2023-11-30 20:53:07 26 4
gpt4 key购买 nike

我的 asp.net MVC 应用程序有一个区域“公司”和一个区域“管理”。

公司可以在公司区域对其用户进行增删改查。我在公司区域为此创建了一个 UsersController。管理员可以在管理区域对公司的用户执行 CRUD。我在管理区域为此创建了一个 CompanyUsersControllers。

两个 Controller 的代码非常相似,我想知道重用大部分代码的最简洁方法是什么。

在写这个问题时,我想我可以创建一个带有虚拟 ActionResults 的抽象 UsersControllerBase 类。我这样做了,它适用于公司区域。我在 UsersController 类中的覆盖方法上定义属性,并在每个覆盖方法中调用相应的抽象方法。

这是基类的一个例子:

[UsersControllerBase.cs]
public virtual ActionResult Edit(string slug)
{
var user = UserRepository.GetBySlug(slug);

if (user.CompanyId != CurrentUser.CompanyId)
{
throw new SecurityException(CurrentUser.Id + " attempted to edit a user that does not belong to his company");
}

var model = user.ToViewModel();
AddListsTo(model);

return View(model);
}

以及相应的覆盖:

[Company/UsersController.cs]
[HttpGet, GET("/company/users/{slug}/edit")]
public override ActionResult Edit(string slug)
{
return base.Edit(slug);
}

问题是 Admin/CompanyUsersController.cs 中的 Edit 有一个额外的参数“companySlug”,用于查找我们当前正在为其编辑用户的公司。正如您在上面的代码中看到的,在 Company/Userscontroller.cs 中,我们只是从 CurrentUser 派生公司。

处理此问题的最佳方法是什么?

td;博士我有 2 个 Controller ,它们具有相同名称的操作,它们具有几乎相同的方法主体但参数不同。我想尽可能多地重用代码。请问我怎么c#。

最佳答案

如果这两个方法具有不同的签名,我认为将其实现为基类方法并不值得,尽管这并非不可能。我会在基类上创建一个 protected 辅助方法,并将共享代码放入其中。像这样(对您的 Repository API 做出一些假设):

[UsersControllerBase.cs]
protected virtual ActionResult Edit(User user)
{
var model = user.ToViewModel();
AddListsTo(model);

return View(model);
}

[Admin/CompanyUsersController.cs]
[HttpGet, GET("/admin/users/{companySlug}/{slug}/edit")]
public ActionResult Edit(string companySlug, string slug)
{
var user = UserRepository.GetBySlug(companySlug, slug);
return base.Edit(user);
}

[Company/UsersController.cs]
[HttpGet, GET("/company/users/{slug}/edit")]
public ActionResult Edit(string slug)
{
var user = UserRepository.GetBySlug(slug);

if (user.CompanyId != CurrentUser.CompanyId)
{
throw new SecurityException(CurrentUser.Id + " attempted to edit a user that does not belong to his company");
}
return base.Edit(user);
}

关于c# - 不同领域中非常相似的 Controller 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20246366/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com