从ASP.NET MVC Web应用程序进行多个独立的数据库调用是不好的做法?

时间:2009-08-03 19:31:44

标签: asp.net-mvc linq-to-sql

我有一个名为[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次数据库调用,一次用于确定用户的类型,另一次用于从相应的表中获取配置文件。

这是不好的做法吗?如果是这样,我该怎么办呢?

1 个答案:

答案 0 :(得分:4)

这并不是一个糟糕的做法,但是你可以通过一个中间层业务对象得到很好的服务,该对象封装了基于usertypename通过用户名查询客户端的逻辑。