需要帮助重组 N 层 MVC/WEB.API 应用程序

Need assistance restructuring an N-Tier MVC/WEB.API app

目前有以下 N 层:

MVC/API UI <-> BLL / DAL / NLL / Model

想完成以下任务:

MVC/API UI <-> BLL <-+-> DAL <-> Model
                     |
                     \-> NLL

我在 DAL 中有一个 class 到 return 上下文。但是,当我尝试引用此 class 时,出现以下错误(在 Whosebug 上多次提到,但都不适用于这种情况):

A field initializer cannot reference the non-static field, method, or property 'Corporate.Web.API.Controllers.SiteAdminAPIController._oDataBaseContext'

以下代码在我的 dbContext 的 DAL 中:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Text;
using System.Threading.Tasks;
using Corporate.Web.API.Model;

namespace Corporate.Web.API.DAL
{
    public class DataBaseContext
    {
        public DbContext dbContext()
        {
            Corporate_WebEntities _oContext = new Corporate_WebEntities();
            return _oContext;
        }
    }
}

以下代码在我的 MVC/API 控制器中:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Description;
using System.Threading.Tasks;
using Corporate.Web.API.Model;
using Corporate.Web.API.DAL;
using Corporate.Web.API.BLL;
...
private readonly DataBaseContext _oDataBaseContext = new DataBaseContext();
private readonly DbContext _oDBContext = _oDataBaseContext.dbContext();
  1. 我需要做什么才能让这个烂摊子正常工作?
  2. 我错过了什么?

在以下行做错了:

private readonly DbContext _oDBContext = _oDataBaseContext.dbContext();

(1) 相反,它应该如下所示:

public class SiteAdminAPIController : Controller
{
    private readonly DataBaseContext _oDataBaseContext = new DataBaseContext();
    private Corporate_WebEntities _oDBContext;

    public SiteAdminAPIController()
    {
         _oDBContext = _oDataBaseContext.dbContext();
    }
}

(2) 或者像下面这样 属性:

private DbContext _oDbContextField;
private DbContext _oDbContext
{
    get{
        if(_oDbContextField == null)
        {
            _oDbContext = _oDataBaseContext.dbContext();
        } 
        return _ODbContext;
    }
}

(3) 许多人不推荐的第三个简单选项是 make _oDataBaseContext。

替换下行

private readonly DataBaseContext _oDataBaseContext = new DataBaseContext();

private static readonly DataBaseContext _oDataBaseContext = new DataBaseContext();

更新 您还需要更新 dbContext() 方法的 return 类型。

public class DataBaseContext
{
    public Corporate_WebEntities dbContext()
    {
        Corporate_WebEntities _oContext = new Corporate_WebEntities();
        return _oContext;
    }
}