Tag: 隔离

不使用ORM的N层数据库应用程序,UI如何指定数据显示的内容?

我在这里寻找指针和信息,我会做这个CW,因为我怀疑它没有一个正确答案。 这是针对C#的,因此我将在下面对Linq进行一些引用。 我也为这篇长篇大论道歉。 让我在这里总结一下这个问题,然后是完整的问题。 简介:在UI / BLL / DAL / DB 4层应用程序中,如何更改用户界面,以显示更多列(例如在网格中),避免泄漏通过业务逻辑层进入数据访问层,掌握要显示的数据(假设它已经在数据库中)。 让我们假设一个有3(4)层的分层应用程序: 用户界面(UI) 业务逻辑层(BLL) 数据访问层(DAL) 数据库(DB;第4层) 在这种情况下,DAL负责构造SQL语句并对数据库执行它们,返回数据。 “正确”构建这样一个层的唯一方法就是始终“select *”吗? 对我来说这是一个很大的禁忌,但让我解释为什么我在想。 让我们说,对于我的用户界面,我希望显示所有拥有活跃就业记录的员工。 “活跃”是指今天的就业记录包含今天(或者甚至是我可以在用户界面中设定的日期)。 在这种情况下,假设我想向所有这些人发送一封电子邮件,所以我在BLL中有一些代码可以确保我还没有向同一个人发送过电子邮件,等等。 对于BLL,它需要最少量的数据。 也许它调用数据访问层来获取活动员工列表,然后调用以获取它发送的电子邮件列表。 然后它加入这些并构造一个新列表。 也许这可以在数据访问层的帮助下完成,这并不重要。 重要的是,对于业务层,它实际上并不需要太多数据。 也许它只需要每个员工的唯一标识符,对于两个列表,匹配,然后说“这些是活动的那些的唯一标识符,您尚未发送电子邮件到”。 然后我构造DAL代码来构造只检索业务层需要的SQL语句吗? IE浏览器。 只是“SELECT id FROM employees WHERE …”? 那么我该怎么做用户界面呢? 对于用户而言,最好包含更多信息,具体取决于我想发送电子邮件的原因。 例如,我可能想要包括一些基本的联系信息,或者他们工作的部门,或者他们的经理姓名等,而不是说我至少要显示姓名和电子邮件地址信息。 用户界面如何获取该数据? 我是否更改了DAL以确保将足够的数据返回给UI? 我是否更改BLL以确保它为UI返回足够的数据? 如果从DAL返回到BLL的对象或数据结构也可以发送到UI,那么BLL可能不需要进行太多的更改,但是UI的要求会影响超出应该与之通信的层。 。 如果这两个世界在不同的数据结构上运行,则可能必须对两者进行更改。 那么当UI被更改时,为了更进一步帮助用户,通过添加更多列,我需要多深才能更改UI? (假设数据已存在于数据库中,因此不需要进行任何更改。) 提出的一个建议是使用Linq-To-SQL和IQueryable,这样如果DAL处理什么(如在什么类型的数据中)和为什么(如WHERE-clauses中)返回IQueryables,BLL可以可能会将这些内容返回到UI,然后可以构建一个Linq查询来检索所需的数据。 然后,用户界面代码可以拉入所需的列。 这可能会有效,因为使用IQuerables,UI最终会实际执行查询,然后它可以使用“select new {X,Y,Z}”来指定它需要的内容,甚至可以在必要时加入其他表。 这看起来很混乱。 […]

MS VisualStudio 2012中的ShimNotSupportedException

我只是想在Visual Studio 2012 RC中熟悉新的Fakes Isolation Framework,但我因此ShimNotSupportedException的问题。 在第一次尝试时,我尝试连接一个委托的每个单一的shim方法,在尝试运行/调试测试时抛出了ShimNotSupportedException 。 [TestMethod] public void GetFoo_ValidBar_ReturnsBaz() { using(ShimsContext.Create()) { ShimDateTime.NowGet = () => new DateTime(2012,08,11,10,20,59); const string expected = “20120811_102059”; string actual = GetFoo(); Assert.AreEqual(expected,actual); } } 这是相应的堆栈跟踪: GetFoo_ValidBar_ReturnsBaz测试方法抛出了一个exception:Microsoft.QualityTools.Testing.Fakes.Shims.ShimNotSupportedException:System.DateTime,位于Microsoft.QualityTools的Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.InvokeEvent(T值,Action1 eh)。 Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.InternalAttachDetour(Object optionalReceiver,MethodBase)中的Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.CheckInstrumentation(MethodBase方法)中的Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.OnAttachedUnsupportedMethod(MethodBase方法)在Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShimMethod(Delegate optionalStub,Object optionalReceiver,Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.AttachDetour(Object optionalReceiver,MethodBase方法,Delegate detourDelegate)上的方法,委托detourDelegate), MethodBase方法) at Microsoft.QualityTools.Testing.Fakes.Sool.ThimRun .SetShimPublicStatic(Delegate optionalStub,Type receiverType,String name,Type returnType,Type [] parameterTypes)在BazTests.cs的GetFoo_ValidBar_ReturnsBaz()的System.Fakes.ShimDateTime.set_NowGet(Func’1值):第48行。 在阅读了我在MSDN上找到的两个线程处理这个问题后,我按照他们的指示(关闭CodeCoverage,删除.testsettings文件),这对我来说不起作用! 不过我找到了解决这个问题的方法: 首先从测试资源管理器运行所有测试(而不是直接从编码区域使用“MSTest测试(单击运行)”按钮)一切正常,没有抛出exception。 […]