C# 如何在MVC控制器中实现数据访问层
我知道数据访问层或简单的DAL用于从数据库访问和检索信息,但我不确定如何在控制器内调用DAL数据。 例如,我在DAL中创建了这个静态类,但我不确定如何将它调用到我的控制器,任何帮助或指导都将不胜感激。DohvatiMetodu是类的名称C# 如何在MVC控制器中实现数据访问层,c#,data-access-layer,C#,Data Access Layer,我知道数据访问层或简单的DAL用于从数据库访问和检索信息,但我不确定如何在控制器内调用DAL数据。 例如,我在DAL中创建了这个静态类,但我不确定如何将它调用到我的控制器,任何帮助或指导都将不胜感激。DohvatiMetodu是类的名称 public static FormInputViewModel DohvatiMetodu() { var viewModel = new FormInputViewModel(); var me
public static FormInputViewModel DohvatiMetodu()
{
var viewModel = new FormInputViewModel();
var metoda = new List<Metoda>();
var metodaList = new List<SelectListItem>();
using (var db = new ApplicationDbContext())
{
metoda = db.Metoda.ToList();
}
foreach (var metod in metoda)
{
metodaList.Add(new SelectListItem() {Value = metod.Id.ToString(), Text = metod.Naziv});
}
viewModel.KoristenaMetoda = metodaList;
return viewModel;
公共静态FormInputViewModel DohvatiMetodu()
{
var viewModel=新FormInputViewModel();
var metoda=新列表();
var metodaList=新列表();
使用(var db=new ApplicationDbContext())
{
metoda=db.metoda.ToList();
}
foreach(metoda中的var metod)
{
Add(new-SelectListItem(){Value=metod.Id.ToString(),Text=metod.Naziv});
}
viewModel.KoristenaMetoda=metodaList;
返回视图模型;
根据用户的众多要求,我用完整的存储库模式更新了代码,并使用简单的CRUD方法逐步更新:
Repository模式在应用程序的数据层和域层之间添加了一个分离层。它还使应用程序的数据访问部分更易于测试
数据库工厂(IDatabaseFactory.cs):
public interface IDatabaseFactory : IDisposable
{
Database_DBEntities Get();
}
public class DatabaseFactory : Disposable, IDatabaseFactory
{
private Database_DBEntities dataContext;
public Database_DBEntities Get()
{
return dataContext ?? (dataContext = new Database_DBEntities());
}
protected override void DisposeCore()
{
if (dataContext != null)
dataContext.Dispose();
}
}
public interface IRepository<T> where T : class
{
void Add(T entity);
void Update(T entity);
void Detach(T entity);
void Delete(T entity);
T GetById(long Id);
T GetById(string Id);
T Get(Expression<Func<T, bool>> where);
IEnumerable<T> GetAll();
IEnumerable<T> GetMany(Expression<Func<T, bool>> where);
void Commit();
}
数据库工厂实现(DatabaseFactory.cs):
public interface IDatabaseFactory : IDisposable
{
Database_DBEntities Get();
}
public class DatabaseFactory : Disposable, IDatabaseFactory
{
private Database_DBEntities dataContext;
public Database_DBEntities Get()
{
return dataContext ?? (dataContext = new Database_DBEntities());
}
protected override void DisposeCore()
{
if (dataContext != null)
dataContext.Dispose();
}
}
public interface IRepository<T> where T : class
{
void Add(T entity);
void Update(T entity);
void Detach(T entity);
void Delete(T entity);
T GetById(long Id);
T GetById(string Id);
T Get(Expression<Func<T, bool>> where);
IEnumerable<T> GetAll();
IEnumerable<T> GetMany(Expression<Func<T, bool>> where);
void Commit();
}
基本接口(IRepository.cs):
public interface IDatabaseFactory : IDisposable
{
Database_DBEntities Get();
}
public class DatabaseFactory : Disposable, IDatabaseFactory
{
private Database_DBEntities dataContext;
public Database_DBEntities Get()
{
return dataContext ?? (dataContext = new Database_DBEntities());
}
protected override void DisposeCore()
{
if (dataContext != null)
dataContext.Dispose();
}
}
public interface IRepository<T> where T : class
{
void Add(T entity);
void Update(T entity);
void Detach(T entity);
void Delete(T entity);
T GetById(long Id);
T GetById(string Id);
T Get(Expression<Func<T, bool>> where);
IEnumerable<T> GetAll();
IEnumerable<T> GetMany(Expression<Func<T, bool>> where);
void Commit();
}
2.现在必须创建用户模型的存储库类
public class UserRepository : Repository<User>, IUserRepository
{
private Database_DBEntities dataContext;
protected IDatabaseFactory DatabaseFactory
{
get;
private set;
}
public UserRepository(IDatabaseFactory databaseFactory)
: base(databaseFactory)
{
DatabaseFactory = databaseFactory;
}
protected Database_DBEntities DataContext
{
get { return dataContext ?? (dataContext = DatabaseFactory.Get()); }
}
public interface IUserRepository : IRepository<User>
{
}
}
干杯!!DAL是用于对数据库执行CRUD操作的独立类文件。您可以调用
StaticClass.MethodName()
直接从控制器访问DAL。从控制器访问DAL没有任何限制,也没有违反MVC中的任何规则。如果它是静态方法,只要通过ClassName.MethodName
访问它,前提是您在范围中有正确的名称空间。当然,现在更常见的做法是不将事物设为静态,而是使用依赖关系i将该类导入控制器。感谢您提供的信息,但我对依赖项注入的形式很感兴趣。请检查下面的ans,了解它的用法。不要编写静态。这会使模拟/单元测试变得非常困难。