我正在开发一个3层应用程序(不是3层!),其中一个客户端应用程序在一个层(物理集群)上运行,该应用程序与另一个层上运行的服务应用程序和另一个层上的数据库服务器交互.该应用程序有很多业务规则,流程逻辑等,我认为应该可以在应用程序层和服务层上使用,以改善用户体验,减少对服务的调用以及消除冗余编码.
让我们使用这个例子:在我的域层中,我有一个Document对象.此对象包含AllowPublish属性,该属性检查对象的内部状态,如果状态允许发布文档,则返回true/false.该对象还有一个Publish方法,该方法通过将IsPublished标志设置为true并引发Published域事件来修改对象的内部状态以反映它正在发布的事实.
我有一个单独的AuthorizationService,它确定是否允许当前用户发布以及将对象持久保存到数据库的DocumentRepository.
在我的服务应用程序中,我的DocumentService有一个PublishDocument方法,它接受文档id,使用id从存储库中检索文档,检查AllowPublish属性,如果为true,则调用Publish,然后使用存储库保存更新的对象.
我在客户端上的行为略有不同.在这种情况下,我使用AllowPublish属性来启用/禁用命令按钮.启用并单击后,我调用一个服务代理,该代理公开一个接受文档ID的PublishDocument方法.代理将调用传递给服务应用程序的同名DocumentService方法.
为了消除重复的代码,共享业务逻辑,验证规则等,我将域对象放置在单独的程序集中,由客户端应用程序和服务应用程序共享.这意味着客户端应用程序现在可以访问我的Document类的Publish方法,即使它只是相关的,并且只应由我的服务应用程序使用.这让我重新考虑我正在采取的整个方法.
虽然我理解使用DTO在客户端和服务器之间传递状态,但我使用的是.NET 3.5,据我所知,共享程序集是与客户端应用程序共享业务和验证规则的唯一方法.我有一些想法,我可以去其他方向,但希望在走上新的道路之前得到一些建议.
另一方面,我对客户端的当前实现采用了我认为是一种全面的授权方法,这可能只是一个不同模型会更好的指标.就像我在我的服务器端服务应用程序中有一个AuthorizationService,DocumentService用来执行授权,我有一个类似于我的客户端代码使用的代理.这意味着我需要在客户端代码中使用另一层间接来支持授权,可能是Controller或ViewModel.如果用例是有效的,那么这很好.
编辑
我可能需要澄清,在编辑文档时,AllowPublish属性是动态的.首次检索时,它可能是错误的,但在满足业务规则时将变为真.在客户端应用程序中运行业务规则可以让我们提供更丰富的用户体验.
在非Silverlight世界中,很容易使用LINQ来创建ObservableCollection.这是因为ObservableCollection类具有接受任何IEnumerable <T>或List <T>的构造函数.但是,Silverlight版本没有!这意味着代码如:
var list = (from item in e.Result
select new ViewModel(item)).ToList();
Items = new System.Collections.ObjectModel.ObservableCollection<ViewModel>(list);
Run Code Online (Sandbox Code Playgroud)
不适用于Silverlight.
除了诉诸于每个声明之外,还有其他选择可以完成这项工作吗?
好吧,我很难过这个,需要一些快速的帮助.
我有一个使用Forms身份验证的ASP.NET应用程序.在我的Login.aspx页面中,我在后台使用了几个图像来获得视觉效果.url是使用文件中定义的CSS样式设置的(不在主题等中).所有图像都位于网站根目录下的Images文件夹中.Images文件夹中有一个单独的web.config,允许所有用户访问.
我遇到的问题是让图像在开发环境和生产环境中一致地解决.我学到(并且无法控制)的是,当我们在Visual Studio中使用Cassini Web服务器进行开发时,该站点被部署到生产中的子站点.因此,使用反斜杠(/)启动每个路径在生产中不起作用(尽管它在开发中工作正常).删除反斜杠会破坏开发环境.
目前,我定义的CSS类似于:
#banner
{
background: transparent url('Images/plainBlueHeader2.png') no-repeat 20% 0;
height: 70px;
top: 21px;
left: 3px;
}
Run Code Online (Sandbox Code Playgroud)
这在开发中不起作用,但它适用于我们的QA和生产环境.
更糟糕的是,这显然工作正常,而且知识较少的同事正在责备最近添加到应用程序中的一些内容,我们在子文件夹中添加了几个新页面.我应该提一下,在此之前所有页面都在站点根目录.
不知道我还能分享什么,所以请提出任何问题来帮助提出解决方案.
更新: 事实证明,三个图像中的一个在所有环境中都能正常显示.与BODY元素相关联的元素正在工作,但其他元素,一个使用上面示例中显示的ID,另一个使用CSS类,则不是.
更新: 这是我的网页的代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="Login" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Login</title>
<style type="text/css">
body { background:#fff url('Images/bodyBackBlue.png') repeat-x;font-size:11px;font-family:Sans-Serif; }
#wrapper { width:990px;margin-top:30px;margin-left:auto;margin-right:auto;position:relative; }
#bannerwrapper { width:990px;margin-left:auto;margin-right:auto;position:relative; }
#banner { background:transparent url('Images/plainBlueHeader2.png') no-repeat 20% 0;height:70px;top:21px;left:3px; }
.logo { float:left;text-decoration:none;margin-left:30px;margin-top:29px; }
.user-greeting { background-image:none;margin:8px 100px;color:#fff;float:right;font-weight:bold; …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种在Silverlight 5中实现真正模态对话的好方法.我发现声称创建模态对话框的每个示例都不是模态的,因为调用代码会等到对话框关闭.
我意识到这是一个挑战,因为我们实际上无法阻止UI线程,因为它必须运行才能使对话框(ChildWindow)正常运行.但是,随着SL5中TPL的加入以及Silverlight在过去几年中所采用的更高水平的采用,我希望有人找到了解决这个问题的方法.
我试图解决的一个很好的代表性场景是一个动作(比如单击一个按钮或菜单项),它显示一个登录对话框,必须等待登录完成才能继续.
我们的具体业务案例(无论是否合乎逻辑)是应用程序不需要用户身份验证; 但是,某些功能需要"管理员"访问权限.当访问该功能时(通过按钮单击或选择菜单项等),并且当前用户不是管理员,我们显示登录对话框.对话框关闭后,我们再次检查用户的授权.如果他们未获得授权,我们会显示一条好消息并拒绝该操作.如果他们被授权,我们将继续执行通常涉及将当前视图更改为新用户可以执行他们所请求的任何操作的操作.
我正在研究如何使用NuGet在我的组织内分发开发人员框架和工具.我有服务器设置,能够生成包并将它们添加到消费项目中.我现在正在寻求将其扩展到更真实的情况.
在我的例子中,我将有一个框架,我们分发给组织中的所有开发团队.这个框架有一个"核心"类库,然后是一组技术特定的库,如Acme.Web,Acme.Silverlight等.这些库中的每一个都引用了"核心"程序集.
我已经将每个这些程序集打包到它自己的NuGet包中,包括"core",它被设置为其他包中的依赖项.这是因为开发人员在创建类库时可能只选择引用"核心",但在创建Web应用程序时也需要这些类型等.
另一个想法是我可以发布我的"核心"程序集的新版本,而不需要更新所有其他程序包.或者我可以吗?
想象一下我有项目A的情况,添加NuGet包B,它依赖于NuGet包C,然后包C被更新.是否可以在不重建,重新包装和重新发布包B的情况下分发此更新?如果是这样,我是否需要采取任何措施来确保没有版本问题?
我看了一遍,还没有找到一个解决方案,以满足我对正常表达式模式的需求,该模式将匹配通用URL.我需要支持多种协议(带验证),localhost和/或IP寻址,端口和查询字符串.一些例子:
理想情况下,我希望该模式也支持提取各种元素(协议,主机,端口,查询字符串等),但这不是必需的.
(另外,出于我和未来读者的目的,如果你能解释这种模式,那将会有所帮助.)
.net ×2
silverlight ×2
asp.net ×1
css ×1
javascript ×1
linq ×1
login ×1
nuget ×1
regex ×1
soa ×1