几个月来,我发布了一些关于ASP.NET应用程序和数据库抽象层结构的问题,以便重写(从头开始)一个遗留的Web应用程序.我最近偶然发现了MVC3/Entity-Code-First,花了一些时间,它已经爱上了它的工作方式,如何抽象出来,我正在寻找任何借口来使用它!
遗留应用程序是一个C++/CLI窗口服务,它生成它自己的HTML(非常老派的HTML,其中CSS只用于颜色和表格比比皆是),并且界面与业务逻辑紧密耦合.基本上,任何事情都会有所改善.
然而,也许这是因为我还没有花足够的时间与MVC,我有一些唠叨的疑虑,并想知道你们中的一些MVC-Pros是否可以在我的方向上挥发他们的经验.
遗留应用程序使用自定义控件(它们自己的形式)将组合框绑定到数据,并根据另一个组合框中的选择动态重新填充相关组合框.在ASP.NET中,这个问题很容易回答,因为只需asp:DataList在页面上抛出控件,将其绑定到数据源即可.一些简单的代码允许您过滤所选值上的其他组合框.在ASP.NET中,实现另一个数据列表也很容易,甚至以这种方式自动化依赖数据(这将很好地模仿遗留应用程序的行为).我似乎无法在MVC中找到自定义控件的概念,尽管我认为这种东西是由jQuery调用处理来获取数据并将其放入组合框中.但是每个包含一个组合框的每个组合框都能完成吗?这是一个部分视图的情况,传递适当的参数,或者这只是愚蠢的?
我想这更多地涉及实体框架比MVC,但大部分我在网上找到的例子和教程,执行LINQ查询返回对象的集合来显示,比如这个,从MvcMovie例如:
public ActionResult Index()
{
var movies = from m in db.Movies
where m.ReleaseDate > new DateTime(1984, 6, 1)
select m;
return View(movies.ToList());
}
Run Code Online (Sandbox Code Playgroud)
然后使用@foreach视图中的循环进行渲染.这一切都很棒.遗留应用程序有一个浏览页面,供系统的所有其他区域使用(超过50个).它通过检查为登录的用户定义的列顺序来执行此操作,展平任何外键(以便显示外部表上的字段而不是非用户友好的主键值)并允许用户应用自定义过滤器到任何列.它也适用于行数超过100k的表.如何使用Entity-framework和views编写类似内容?在ASP.NET中,我可能通过动态生成某种网格视图并让它自动生成列并应用过滤器来解决这个问题.这似乎可能是我在MVC中的更多工作.我错过了什么?
遗留应用程序具有多个操作大型数据集的操作.现在因为它是一项服务,它可以启动这些线程而不必担心被关闭.我在SO上的一个问题是关于静态管理器的存在以及AppPool回收的引入,但我已经决定使用辅助服务是一个不错的选择.也就是说,遗留应用程序将更新语句应用于大型记录组而不是单行.如果没有为绕过正常模型的数据库编写自定义SQL,这是否可以使用Entity-Framework?我希望我不必做这样的事情(不是我想,这只是例如)
var records = from rec in myTable
where someField = someValue
select rec;
foreach(rec in records)
rec.applyCalculation();
db.SaveDbChanges();
Run Code Online (Sandbox Code Playgroud)
我怀疑这可能需要花费很多时间,而遗留应用程序只会:
UPDATE myTable
SET field1 = calc
WHERE someField = someValue
Run Code Online (Sandbox Code Playgroud)
因此,我并不完全清楚我们如何以这种方式使用我们的模型.
遗留应用程序在布局中有一些数据面板,可以随身携带任何页面.看看Stackoverflow,我发现了这个问题,这意味着每个视图都需要将这些信息传递给布局?是这样,还是有更好的方法?理想情况下,我希望我的布局能够访问特定的模型/存储库并在侧面板中显示数据.添加到每个视图页面可能非常重复并且容易出错.更不用说如果我需要修改某些东西需要的时间.部分视图会在这里完成,但我再次不确定如何在布局页面上将模型传递给它.
最后,在安装Ef-Code-First之后,我很失望地发现一个非常好的属性,SourceName还没有进入.这对于遗留表/列的映射非常好,我不完全确定为什么它在这一点上被遗漏了(至少,我的intellisense说它不存在!)有没有人知道这可能会发生什么?我可以在没有它的情况下做一段时间,但最终它会非常有用.
对不起,这是一个很长的问题.经过ASP.NET和MVC3的多年调查工作,我真的很想使用MVC3!
在以下HTML中,我需要使用Selenium Webdriver获取登录值.
<div
roletitle="MD"
careteamrole="HOSPITALIST"
login="adamss"
isconsultctm=""
title="Adams Samuel"
style=""
class="assign_grid assign_grid_selected"
id="97">
</div>
Run Code Online (Sandbox Code Playgroud)
我尝试了以下,但它失败了: -
WebElement getAssigneeLoginWebElement = ieDriver.findElement(By.cssSelector(".assign_grid assign_grid_selected"));
sAssignedCTMLoginId = getAssigneeLoginWebElement.getAttribute("login");
Run Code Online (Sandbox Code Playgroud)
sAssignedCTMLoginId = ieDriver.findElement(By.className("assign_grid assign_grid_selected")).getAttribute("login");
Run Code Online (Sandbox Code Playgroud)
sAssignedCTMLoginId = ieDriver.findElement(By.xpath("//*[@class='assign_grid assign_grid_selected']/@login[1]")).getText();
Run Code Online (Sandbox Code Playgroud)
先感谢您
我使用嵌套集来表示我的应用程序中的层次结构,并且想知道放置索引(聚簇或其他)的最佳位置.我正在使用Microsoft SQL Server 2008.
操作:
我玩弄了左右两个聚集索引(大多数时候,它会用a来查询val BETWEEN @left AND @right.但是左右聚类是正确的方法吗?
非常感谢任何比我更有SQL索引经验的人!
架构原样
_id INT IDENTITY NOT NULL
_idParent INT IDENTITY NULL
_name NVARCHAR(64)
_left INT NOT NULL
_right INT NOT NULL
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个自定义成员资格提供程序,以便将Umbraco中的用户验证到Umbraco之外的现有数据库.从我到目前为止所学到的,创建一个继承umbraco.providers.members.UmbracoMembershipProvider并覆盖ValidateUser()函数的类应该没有多少工作量 .
我想知道当我希望将这个类包含在我的Umbraco项目中而不是在web.config文件中指定它时我应该怎么做?是否有可能以这种方式扩展Umbraco,重新编译源代码?
编辑 - 我写了一篇关于我如何在http://marcus-abrahamsson.se/post/Membership-Provider-in-Umbraco上实现这一点的文章
使用IDbConnection.ExecuteSql时如何设置命令超时?
IDbConnection db = ConnectionFactory.OpenDbConnection();
db.ExecuteSql("...");
Run Code Online (Sandbox Code Playgroud)
如果我使用IDbCommand.ExecuteSql(见下文)方法,我可以设置命令超时,但我得到一堆关于弃用方法的警告.
IDbCommand comm = db.CreateCommand()
comm.CommandTimeout = 240;
comm.ExecuteSql("...");Run Code Online (Sandbox Code Playgroud) 我一直在评估ServiceStack,到目前为止,我已经出售了很多 - 但我有一个要求,我认为这将成为一个交易破坏者.
我基本上需要多个AppHost派生的实例.第一个很好地旋转,但其余的失败,因为"AppHostBase.Instance已经设置".
这是否意味着如果我想要多个主机(在不同的Uris上),在不同的可执行文件中?如果是这样,这是相当令人失望的,因为除了这个限制之外,这个库在其他方面都是完美的.
如果我错了,有人能指出我的解决方案吗?
请允许我详细说明一下.我们计划通过网络提供许多服务.我的目的是将它们设计为单独的服务,然后在托管类中"托管".托管类本身是用于管理目的的服务,并且具有启动和停止服务的能力.它们在整个网络中是"可被发现的".我们可以在不同时间或不同时间启动和降低不同机器上的服务.
我的计划是为每个事物使用服务堆栈,并且能够在任何机器和任何"主机"上以临时方式创建和销毁服务.我唯一磕磕绊绊的是AppHost只被初始化一次.
显然我做错了,所以关于如何在同一个可执行文件中托管多个服务的任何信息都会很棒:)
就在我今天写一些IDisposable代码的时候,我正在考虑这个。
对于开发人员来说,Dispose()直接调用或者在对象的生命周期允许的情况下使用using构造是一种很好的做法。
我们需要担心的唯一实例是那些using由于我们的代码机制而无法使用的实例。但是我们应该在某个时候调用Dispose()这些对象。
鉴于 C# 编译器知道一个对象 implements IDisposable,它理论上也可以知道它Dispose()从未被调用过(它是一个非常聪明的编译器!)。它可能不知道当程序员应该做它的语义,但它可以作为一个很好的提醒,它永远不会被调用,因为它从来没有在使用using结构和方法Dispose()从未直接调用,任何对象实现上IDisposable.
有什么原因吗,或者有没有想走这条路的想法?
考虑这种情况.
您有一个存储库,允许对其进行某些调用.这些调用使用LINQ,并且就返回的数据量而言可能相对昂贵.
鉴于在我的情况下,如果数据是旧的并不是太糟糕 - 可以实现缓存,因此每次调用都不会执行大而昂贵的查询.嘿,我们甚至可以实现一些缓存策略来确定何时根据时间或用途再次执行该查询.
我试图解决的问题是如何在缓存中键入它.一种方法是简单地说:
"querytype1" = Particular LINQ expression
"querytype2" = Particular LINQ expression
Run Code Online (Sandbox Code Playgroud)
然后通过一个简单的字符串键入缓存.但是,鉴于我们正在使用LINQ,我们是否可以通过LINQ表达式本身来键入缓存?我理解性能指标,但无论如何要比较两个LINQ表达式是否相同?
我研究了几个关于SO的问题,但似乎无法找到答案.谁知道,也许我打破了最佳实践.在阅读了关于使用布局注入器属性以通过简单地指定属性来设置布局的优秀答案之后,我想我也可以使用这种类来定义需要用户进行身份验证的控制器.
所以,我不是必须在任何地方检查身份验证,而是写了以下内容:
// class AdminAttribute
public class AdminAttribute : LayoutInjectorAttribute
{
// ctor
public AdminAttribute()
: base("_LayoutAdmin")
{
} // eo ctor
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
WebUser user = WebApplication.CurrentUser;
if (!user.IsAuthenticated)
{
filterContext.Result = new ViewResult() { ViewName = "Unauthorised" };
filterContext.Controller.ViewData.Model = new ViewModel(WebApplication.CurrentUser.Translate("msgunauthorisedtitle"));
filterContext.Result.ExecuteResult(filterContext.Controller.ControllerContext);
return;
}
base.OnActionExecuting(filterContext);
} // eo OnActionExecuting
} // eo class AdminAttribute
Run Code Online (Sandbox Code Playgroud)
除了null处理视图时模型的事实,所有工作都有效.有谁知道为什么会这样?
视图页面(Unauthorised.cshtml)
@model Py2.Web.ViewModel
<h2>@Model.Title</h2>
Run Code Online (Sandbox Code Playgroud)
提前致谢!
我已经到了设计的重点,我正在认真考虑单身人士.
众所周知,"常见"的论点是"永远不要做!这太糟糕了!",好像我们用一堆goto语句把我们的代码搞得一团糟.
ServiceStack是一个很棒的框架.我自己和我的团队都在其上销售,我们有一个复杂的基于Web服务的基础设施来实现.我一直鼓励异步设计,并在可能的情况下 - SendAsync在服务堆栈客户端上使用.
鉴于我们所有这些不同的系统都在做不同的事情,我想要有一个共同的记录器,(实际上是一个Web服务,如果Web服务不可用,则会回退到本地文本文件) - 例如,一些恶魔正在跟踪建筑物).虽然我是依赖注入的忠实粉丝,但对于每个异步请求传递对"使用此记录器客户端"的引用似乎并不干净(至少对我而言).
鉴于ServiceStack的失败签名是一个Func<TRESPONSE, Exception>(我对此没有任何错误),我甚至不确定如果首先进行调用的封闭方法将具有有效句柄.
但是,如果我们此时有一个单例记录器,那么我们在世界的哪个位置,我们所处的线程以及我们所处的无数匿名函数的哪一部分并不重要.
这是一个被接受的有效案例,还是一个非争论的单身人士?
c# ×8
servicestack ×3
.net ×1
asp.net ×1
asp.net-mvc ×1
caching ×1
idisposable ×1
indexing ×1
linq ×1
nested-sets ×1
selenium ×1
sql ×1
sql-server ×1
umbraco ×1
vb.net ×1
viewmodel ×1
webdriver ×1