C# 如何在MVC控制器中实现数据访问层

C# 如何在MVC控制器中实现数据访问层,c#,data-access-layer,C#,Data Access Layer,我知道数据访问层或简单的DAL用于从数据库访问和检索信息,但我不确定如何在控制器内调用DAL数据。 例如,我在DAL中创建了这个静态类,但我不确定如何将它调用到我的控制器,任何帮助或指导都将不胜感激。DohvatiMetodu是类的名称 public static FormInputViewModel DohvatiMetodu() { var viewModel = new FormInputViewModel(); var me

我知道数据访问层或简单的DAL用于从数据库访问和检索信息,但我不确定如何在控制器内调用DAL数据。 例如,我在DAL中创建了这个静态类,但我不确定如何将它调用到我的控制器,任何帮助或指导都将不胜感激。DohvatiMetodu是类的名称

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,了解它的用法。不要编写静态。这会使模拟/单元测试变得非常困难。