重构模型将控制器代码绑定到类

时间:2016-01-27 22:33:33

标签: c# asp.net-mvc linq

我目前在我的控制器中有以下代码。 这里看起来有点混乱,我宁愿将JQuery重构为一个类。 我将在网站的许多地方需要这些数据库信息,不重复使用查询似乎很遗憾。

是否可以从课堂上做到这一点?我不确定返回它的对象,就像代码在类中一样。

var profileViewModel = (from da in db.table1
                                from ra in db.table2.Where(_ra => da.someID == _ra.someID).DefaultIfEmpty()
                                from rg in db.table3.Where(_rg => da.someID2 == _rg.someID2).DefaultIfEmpty()
                                from re in db.table4.Where(_re => da.someID3 == _re.someID3).DefaultIfEmpty()
                                where da.UserName == model.mUserName
                                select new ManageUserAccountsViewModel
                                {
                                    FirstName = ra.FirstName,
                                    Surname = ra.Surname,
                                    Email = da.UserName, 
                               });

1 个答案:

答案 0 :(得分:0)

首先,你想要让你的哑存储POCO。让我们称之为。

public class DumbStoragePoco { 
    public string FirstName {get;set;} 
    public string Surname {get;set;} 
    public string Email {get;set;}
}

现在我们继续为此创建一个Data-Access-Layer类。

public class UserAccountData {
    private readonly DbContext _context;
    public UserAcctionData(DbContext context) { _context = context; }

    public Get(string username) {
        return from da in _context.table1
        from ra in _context.table2.Where(_ra => da.someID == _ra.someID).DefaultIfEmpty()
        from rg in _context.table3.Where(_rg => da.someID2 == _rg.someID2).DefaultIfEmpty()
        from re in _context.table4.Where(_re => da.someID3 == _re.someID3).DefaultIfEmpty()
        where da.UserName == username
        select new DumbStoragePoco
        {
            FirstName = ra.FirstName,
            Surname = ra.Surname,
            Email = da.UserName, 
        });
}

现在,您将在控制器中实例化UserAccountData,并使用用户名调用Get方法来获取DumbStoragePoco的实例,然后您可以将其传递到您可能喜欢的任何ViewModel。如果要进一步抽象,可以围绕数据访问调用实现存储库模式。您可以从UserAccountData中提取一个接口,并将其与依赖注入和控制容器的反转一起使用,以创建进一步的抽象,使得所有Controller所做的是接受其构造函数中的正确接口,并对其进行调用以获得预期的返回类型。