我有一个名为[RequiresCompletedProfile]的控制器属性,我可以使用操作方法禁止用户去那里,除非他们已经完成了他们的个人资料。
当我有一种用户时,这工作正常,但该应用程序已经发展为拥有两种用户:供应商和客户。
因此,不再有“User_Profile”表。现在有一个“Client_Profile”和一个“Vendor_Profile”,它们的模式是不同的。我应该注意到我正在使用LINQ,但我将所有LINQ对象映射到POCO,然后再将它们返回。
我的解决方案是创建一个名为“User_Type”的接口,它具有以下方法:
bool IsProfileCompleted();
现在,我的客户端对象和我的供应商对象都可以实现界面,并负责确定他们的字段/成员是否构成他们的配置文件完成。
但是,现在我有多种用户类型,我不能确定从哪个表中提取配置文件,所以我必须做这样的事情:
public class RequiresCompleteProfileAttribute : ActionFilterAttribute
{
IUserRepository userRepo = new SqlUserRepository();
IClientProfileRepository clientProfileRepo = new SqlClientProfileRepo();
IVendorProfileRepository vendorProfileRepo = new SqlVendorProfileRepo();
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.User.Identity.IsAuthenticated)
{
// Database call #1
var user = userRepo.GetUserByUsername(User.Identity.Name);
UserType profile;
if (user.UserTypeName == "Client")
{
// Database call #2
profile = clientProfileRepo.GetClientByUserName(filterContext.HttpContext.User.Identity.Name);
}
else
{
// Database call #2
profile = vendorProfileRepo.GetClientByUserName(filterContext.HttpContext.User.Identity.Name);
}
if (!profile.IsProfileCompleted())
filterContext.HttpContext.Response.Redirect("/admin/editprofile/");
}
base.OnActionExecuting(filterContext);
}
}
您可以在此处看到,我必须进行2次数据库调用,一次用于确定用户的类型,另一次用于从相应的表中获取配置文件。
这是不好的做法吗?如果是这样,我该怎么办呢?
答案 0 :(得分:4)
这并不是一个糟糕的做法,但是你可以通过一个中间层业务对象得到很好的服务,该对象封装了基于usertypename通过用户名查询客户端的逻辑。