小编Bri*_*den的帖子

使用ORM实体框架的通用存储库模式+ UOW模式有什么优势

让我们从两个引用开始,总结这个问题:"结束DbContext是一个漏洞的抽象.无论如何,你最终都会对服务/控制器层中的EF产生某种依赖." 引用参考 和第二个引用:

"DbContext类

表示工作单元和存储库模式的组合,使您可以查询数据库并将更改组合在一起,然后将这些更改作为一个单元写回到存储中." MSDN

请不要说存储库模式允许您简单地换出数据库,但事实并非如此.有没有人用过成熟的应用程序做过这件事?另请注意,Repository模式不应该暴露IQueryable,我认为这只是另一种说法,你不相信与你合作的人.

我完全用于封装,代码覆盖/可测试性,但由于这个流行的回购模式为EF暴露了IQueryable,它似乎不再需要这种模式:

   public interface IRepository<T> where T : class
    {
    IQueryable<T> GetAll();
    T GetById(int id);
    IEnumerable<T> Get(Expression<Func<T, bool>> filter = null,Func<IQueryable<T>,IOrderedQueryable<T>> orderBy = null, string includeProperties = "");
    void Add(T entity);
    void Update(T entity);
    void Delete(T entity);
    void Delete(int id);
}
Run Code Online (Sandbox Code Playgroud)

存储库模式与UOW模式相结合的唯一好处是:1.轻松启用依赖注入模式以提高可测试性/代码覆盖率2.封装外部集成存在的复杂性(对不同供应商,Web apis,数据库的Web服务调用)等.)

那么通过使用MyDbContext:DbContext类,我得到的是什么封装?我的ORM是抽象当然我通过工作的UOW和常见的查询(如添加和删除)获得控制器的一些统一性,但这真的值得付出努力.我不能只相信我的开发人员是统一的,当他们按照自己的方式做到这一点时,就不要让OCD得到它.并且由于控制器可以编写它想要的任何查询,这不会在单元测试面前飞行吗?AND(甚至更大的大写lol)如果我有第三方API来调用,我可以在MyDbContext类中为控制器访问它,这看起来就像是对控制器的另一个数据调用.

我再说一遍,为什么不直接使用ORM,它就是数据抽象!

以下是针对存储库模式的一些参数:

http://ayende.com/blog/4784/architecting-in-the-pit-of-doom-the-evils-of-the-repository-abstraction-layer

http://ayende.com/blog/3955/repository-is-the-new-singleton

http://lostechies.com/jimmybogard/2012/09/20/limiting-your-abstractions/

http://lostechies.com/jimmybogard/2012/10/08/favor-query-objects-over-repositories/

以下是存储库模式的正确参数(尽管不够令人信服):http: //www.sapiensworks.com/blog/post/2012/10/10/Do-We-Need-The-Repository-Pattern.aspx

entity-framework repository-pattern

4
推荐指数
1
解决办法
4296
查看次数

来自未预编译的ASP.NET网站的预编译相关错误

我有一个XCOPIED生产的ASP.NET网站.我不使用Visual Studio发布此网站.我只是将所有aspx和后面的代码复制到生产中.没有发布配置文件.我的生产服务器运行IIS 7.5,集成管道.如果我将App_Code目录添加到网站的根目录,我会收到以下错误:

不允许使用目录/ App_Code,因为该应用程序是预编译的

我注意到的另一个问题是我的global.asax文件的Application_Start没有被调用.(当我抛出异常时,我肯定知道这一点)

asp.net iis iis-7.5

4
推荐指数
1
解决办法
1万
查看次数

将WebGrease升级到版本1.3.0仅在生产服务器上导致错误

首先,回答这个问题,不要解决我的错误:

将WebGrease升级到1.3.0版本会让我出错

我的生产服务器上有以下bindingredirect:

<dependentAssembly>
    <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-1.3.0.0" newVersion="1.3.0.0" />
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud)

我在生产服务器上有以下DLL,它们是Microsoft ASP.NET Web Optimization Framework所必需的:

  1. System.Web.Optimization.dll 1.0.0.0(这不是预发布版本)
  2. Antlr3.Runtime.dll 3.3.1.7705
  3. Webgrease.dll 1.3.0.0

我收到以下错误:

Could not load file or assembly 'WebGrease, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

我已经检查了GAC,我已经删除了所有临时ASP.NET文件夹,我已经尝试newVersion从我的配置中删除该属性<bindingRedirect>.我不确定是什么告诉ASP.NET寻找WebGrease 1.0

asp.net iis-7.5 asp.net-mvc-4 webgrease

4
推荐指数
1
解决办法
8752
查看次数

Visual Studio 2013使用旧网站名称

因此,在Visual Studio 2012中,我将解决方案中的网站重命名为"oldname"到"newname".我在Visual Studio 2013中打开了这个解决方案,不知怎的,它使用"oldname"代替"newname".这不是ASP.NET网站应用程序只是一个ASP.NET网站.

我搜索了解决方案目录中所有文件的内容,但找不到"oldname".我100%肯定"oldname"不在.sln文件中,并且网站当然没有项目文件.

visual-studio visual-studio-2012 visual-studio-2013

4
推荐指数
2
解决办法
4004
查看次数

发现/查找Project实际用于已安装的Nuget包的"packages"目录的物理位置

所以我继承了一个项目,我注意到解决方案根目录下有一个"packages"目录,而项目中的第二个"packages"目录是解决方案的一部分.

我希望Nuget没有使用两个位置的混合来安装软件包,我希望使用解决方案根级别来存储/引用软件包.

有没有办法可以找到项目用于包的项目的实际物理位置,而不是查看每个DLL上的F4属性,因为这对Javascript Nuget包没有帮助,还有,有办法更改物理参考没有卸载并重新安装每个包?

更新 更新此答案以分享我到目前为止所做的工作,即使我还没有实现解决方案

所以我删除了ProjectA中的packages目录并提交给了TFS.

然后,我关闭了Visual Studio 2012并确保我的ProjectA/packages.config保持完整,没有任何更改.

我构建了ProjectA并且存在引用错误.然后我尝试运行Update-Package -Reinstall,这只是物理删除了我的大部分包,并没有重新安装它们.

我检查了我的Nuget.config,我检查了我的.csproj我删除了csproj.user和.suo文件.我反复关闭了Visual Studio 2012.什么都没有给我一个良好的构建,没有什么是恢复我的Nuget包,我问了一个新的问题:https://stackoverflow.com/questions/30406566/nuget-is-removing-packages-on-update-package-reinstall -after-运动包二

c# asp.net-mvc nuget visual-studio-2012

4
推荐指数
1
解决办法
3411
查看次数

如何在C#中存储两个二进制字符串并使用OR运算符

输入:

10101
11100
Run Code Online (Sandbox Code Playgroud)

我想将这两个字符串存储在一个数据类型中,以便我可以在这两个字符串上调用|OR运算符.

这是我的代码:

        var g = new byte[2][];

        g[0] = "10101".Select(item => byte.Parse(item.ToString())).ToArray();
        g[1] = "11100".Select(item => byte.Parse(item.ToString())).ToArray();

        //won't compile
        Console.WriteLine(g[0] | g[1]);
Run Code Online (Sandbox Code Playgroud)

我得到的编译器错误是:

无法应用运算符'|' to operands byte []和byte []

我也尝试了BitArray,但这似乎也没有.我尝试了byte.Parse("10101"),这只会导致溢出,这对我来说是有道理的.

我想要做的是OR两个字符串的位和结果将= 1,也许我需要移位for循环中的位,我想也许我可以只是OR两个匹配长度二进制字符串的二进制表示

显然我选择了错误的数据类型byte []来存储我的二进制字符串,我只是没有足够的经验知道如何用正确的数据类型表示这些二进制字符串.

UPDATE

选择正确的答案很困难,因为有多个正确的答案.只是想清楚的是,这个问题有多种解决方案,这些都是很好的答案.

我的问题源于我在HackerRank上试图解决的问题:https://www.hackerrank.com/challenges/acm-icpc-team

"你有一份N人参加ACM-ICPC世界总决赛的名单.他们每个人都精通一个主题,或者他们不是.找出一个2人团队可以知道的最大主题数量.还有找出有多少团队可以知道最多的主题."

感谢我在Stack Overflow上收到的帮助,我提出了一个不错的解决方案:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

class Solution {
static void Main(String[] args) {
    var inputArr = Console.ReadLine().Split(' ').Select(item => int.Parse(item)).ToArray();
    var n = inputArr[0];
    var m = inputArr[1];


    var g …
Run Code Online (Sandbox Code Playgroud)

c#

4
推荐指数
1
解决办法
710
查看次数

从多个位置删除相同的值 Firebase 函数

我有一个 firebase 功能,可以在 24 小时后删除旧消息,就像我的旧问题一样 在这里的。我现在只将 messageIds 存储在用户下的数组中,路径是:/User/objectId/myMessages,然后是 myMessages 下所有 messageIds 的数组。所有消息都会在 24 小时后删除,但用户个人资料下的 ID 会保留在那里。有没有办法继续该功能,以便它也从用户帐户下的数组中删除 messageIds?

我是 Firebase 函数和 javascript 的新手,所以我不知道该怎么做。感谢所有帮助!

javascript node.js firebase firebase-realtime-database google-cloud-functions

4
推荐指数
1
解决办法
356
查看次数

尝试使用安全透明方法'System.Web.WebPages.Administration.SiteAdmin.RegisterAdminModule()'来访问安全关键

我在Amazon EC2实例上收到以下错误:

Attempt by security transparent method 'System.Web.WebPages.Administration.SiteAdmin.RegisterAdminModule()' to access security critical method 'System.Web.WebPages.ApplicationPart..ctor(System.Reflection.Assembly, System.String)' failed.
Run Code Online (Sandbox Code Playgroud)

互联网上没有任何内容可以显示此特定错误消息.我正在运行ASP.NET MVC 5应用程序.我对我的Amazon EC2实例有一定程度的怀疑,因为我记得读过有关.NET反射的亚马逊AWS安全锁定的一些内容.

任何指导将不胜感激.

c# asp.net-mvc asp.net-mvc-4

3
推荐指数
1
解决办法
1682
查看次数

Javascript中所有LinkedList节点的正确迭代

在我的代码片段中,我使用while循环迭代LinkedList节点,我是console.logging每个节点值.我的while循环存在,我的最后一个值必须是while.循环之后的console.log下一行,无论如何要为我的LinkedList创建一个更优雅的迭代器?

function LinkedList() {
    this.head = null;
};

LinkedList.prototype = (function () {
    function reverseAll(current, prev) {
        if (!current.next) { //we have the head
            this.head = current;
            this.head.next = prev;
        }

        var next = current.next;
        current.next = prev;

        reverseAll(next, current);
    };

    return {
        constructor: LinkedList,

        reverse: function () {
            reverseAll(this.head, null);
        },

        head: function() {
            return this.head;
        }
    }
})();

LinkedList.prototype.add = function(value) {
    var node = {
        value: value,
        next: null
    };

    var current;

    if (this.head === null) { …
Run Code Online (Sandbox Code Playgroud)

javascript

3
推荐指数
1
解决办法
4370
查看次数

在开始日期和结束日期之间 Firestore

我有带有startDate和 的文档endDatestartDate我想查询和之间的范围endDate。我可以在一个日期的范围之间查询,如下所示:

whereField("startDate", isGreaterThan: start).whereField("startDate, isLessThan: end)
Run Code Online (Sandbox Code Playgroud)

但我无法像这样查询两个字段:

whereField("startDate", isGreaterThan: start).whereField("endDate", isLessThan: end)
Run Code Online (Sandbox Code Playgroud)

在复合 where 语句中使用多个字段时,Firestore 会发生异常。

firebase google-cloud-firestore

2
推荐指数
1
解决办法
1527
查看次数