需要帮助重组 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();
- 我需要做什么才能让这个烂摊子正常工作?
- 我错过了什么?
在以下行做错了:
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;
}
}
目前有以下 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();
- 我需要做什么才能让这个烂摊子正常工作?
- 我错过了什么?
在以下行做错了:
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;
}
}