C# 当不首先使用代码时,良好的通用存储库模式

C# 当不首先使用代码时,良好的通用存储库模式,c#,.net,entity-framework,repository,repository-pattern,C#,.net,Entity Framework,Repository,Repository Pattern,我正试图为我的ASP.NET MVC应用程序了解存储库模式和依赖项注入概念 我浏览了这篇文章,非常喜欢它的代码是多么简单。似乎没有那么多代码,而且都是完全通用的。也就是说,没有必要像大多数人那样为数据库中的不同对象建立多个存储库。这正是我想要的 但是,代码是先为代码编写的,我不打算使用它 问题: 对于不首先使用代码的应用程序,为什么不能使用相同的代码,有什么好的理由吗 有人能为我的不首先使用代码的应用程序推荐一种更好的方法吗?(请记住,我绝对相信这种通用模式。) 还有其他的建议可以帮助我前进吗

我正试图为我的ASP.NET MVC应用程序了解存储库模式和依赖项注入概念

我浏览了这篇文章,非常喜欢它的代码是多么简单。似乎没有那么多代码,而且都是完全通用的。也就是说,没有必要像大多数人那样为数据库中的不同对象建立多个存储库。这正是我想要的

但是,代码是先为代码编写的,我不打算使用它

问题:

  • 对于不首先使用代码的应用程序,为什么不能使用相同的代码,有什么好的理由吗
  • 有人能为我的不首先使用代码的应用程序推荐一种更好的方法吗?(请记住,我绝对相信这种通用模式。)
  • 还有其他的建议可以帮助我前进吗

  • 您可以为任何基础数据存储创建存储库接口。您可以这样简单地定义一个接口:

    public interface IRepository
    {
        IQueryable<T> GetQueryable<T>();
    
        void Insert<T>(T item);
    }
    
    公共接口IRepository
    {
    IQueryable GetQueryable();
    无效插入(T项);
    }
    
    然后,您可以在其后面实现一个类,该类将实现它。它不必先编写代码;例如,您可以使用从EDMX文件创建的备份

    这里的关键是创建正确的抽象。您可以通过一个接口轻松地实现这一点,然后在幕后以您想要的方式实现它

    因为您使用的是依赖项注入,所以实现并不重要,只要您正确定义了契约,实现(和测试)就应该简单。如果它不起作用,或者你想要一个完全不同的数据存储,你只要告诉你的依赖注入器使用不同的实现,契约就不会改变


    对于您创建的任何抽象,也可以这样说;您可以有一个读取和写入数据的接口(就像您引用的文章一样),您只需提取抽象。

    您可以为任何底层数据存储创建存储库接口。您可以这样简单地定义一个接口:

    public interface IRepository
    {
        IQueryable<T> GetQueryable<T>();
    
        void Insert<T>(T item);
    }
    
    公共接口IRepository
    {
    IQueryable GetQueryable();
    无效插入(T项);
    }
    
    然后,您可以在其后面实现一个类,该类将实现它。它不必先编写代码;例如,您可以使用从EDMX文件创建的备份

    这里的关键是创建正确的抽象。您可以通过一个接口轻松地实现这一点,然后在幕后以您想要的方式实现它

    因为您使用的是依赖项注入,所以实现并不重要,只要您正确定义了契约,实现(和测试)就应该简单。如果它不起作用,或者你想要一个完全不同的数据存储,你只要告诉你的依赖注入器使用不同的实现,契约就不会改变


    对于您创建的任何抽象,也可以这样说;您可以有一个读取和写入数据的接口(就像您引用的文章一样),您只需将抽象提取出来。

    看看这个。我想这个链接对你帮助最大


    在这个链接中,通用存储库模式与MVC项目中的依赖项注入一起使用,而不使用代码优先的方法。

    看看这个。我想这个链接对你帮助最大


    在这个链接中,通用存储库模式与MVC项目中的依赖项注入一起使用,而不使用代码优先的方法。

    我不确定我是否理解这个问题。如果我不先使用代码,还有什么其他选择呢?下面是一篇有趣的(尽管是自以为是的)文章,关于genric存储库是一种反模式。你可能不同意,但这是一篇深思熟虑的文章:我不确定我是否理解这个问题。如果我不先使用代码,还有什么其他选择呢?下面是一篇有趣的(尽管是自以为是的)文章,关于genric存储库是一种反模式。你可能不同意,但无论如何,这是一篇深思熟虑的文章:谢谢。我知道我引用的代码没有使用UoW模式,但我不确定我是否理解为什么它不是一个存储库。显然,存储库需要允许写入数据库。什么“额外的写入位”使您认为它不是一个存储库?另外,对于认为使用多个存储库不是一个好方法的开发人员,您有推荐的存储库代码吗?@JonathanWood从技术上讲,像LINQ to Entities这样的东西会返回给您,而存储库处理的是域对象。就个人而言,我不是一个固执己见的人,如果我有一个接口,允许我以只读方式访问数据传输对象,那么我可以将其称为存储库。@JonathanWood同样,如果使用我上面定义的接口,没有理由拥有多个存储库;如果您有单独的底层数据存储,那么您只能使用单独的存储库;由于您返回的是
    IQueryable
    ,并且类型参数在方法上,因此您应该能够轻松地查询大多数内容。@JonathanWood本人,当我需要在同一操作中读写时(想想您是否真的必须这样做)我有一个特定的接口,它结合了这两个类以及与工作单元和存储库类的实现不同的类实现;您可以有一个类来实现所有这些功能,但这样您就可以将存储库转换为工作单元,这是一件坏事;如果您需要读写访问,您必须显式地请求它。我在实体框架的上下文中可视化这些数据传输对象时遇到了困难,但对我来说,这似乎是一个不必要的复杂程度。无论如何,我看到的所有示例存储库都使用多个存储库。我现在快用完了,但稍后会更详细地查看您的答复。再次感谢,谢谢。我知道我引用的代码没有使用UoW模式,但我不确定我是否理解为什么会这样