我有一个自动构建过程,我想扩展,所以我可以构建我通过NuGet分发的库.目前,运行nuget.exe来创建包是一个手动操作.
设置VS 2010的最佳方法是什么,以便我的NuGet包(*.nupkg)文件是"Release"构建的最终结果?
请记住,我有一些包的其他文件(内容和工具).而且,在大多数情况下,我将多个项目合并到一个NuGet包中,以支持.NET 4,Silveright和Phone 7.
(我应该澄清一下,现有的"自动化"流程是一个简单的批处理文件运行器,可以使用命令行构建解决方案.)
UPDATE
我想更新此讨论,因为问题尚未解决.虽然提供的@pravin链接很有帮助,但它并没有解决我在单个包中有多个项目以及PowerShell脚本,配置和源代码转换等其他内容的事实.
我可以使用的最好的例子是具有.NET 4和Silverlight 5版本的程序集.它们分布在同一个包中.我不能使用post-build事件来创建包,因为包依赖于两个项目.
根据Fowler(此处),存储库"在域和数据映射层之间进行调解,就像内存域对象集合一样." 因此,例如,在我的Courier Service应用程序中,当提交新的运行时,我的应用程序服务会创建一个新的运行聚合根对象,使用请求中的值填充它,然后将其添加到RunRepository,然后再调用要保存的工作单元对数据库的更改.当用户想要查看当前运行的列表时,我查询相同的存储库并返回表示该信息的非规范化DTO.
但是,在查看CQRS时,查询不会访问同一个存储库.相反,它可能直接针对数据存储并始终是非规范化的.我的命令方将演变为NewRunCommand和Handler,它将创建并填充NewRun域对象,然后将信息保存到数据存储.
所以第一个问题是,如果我们不维护域对象的内存中集合(缓存,如果你愿意的话),那么存储库在哪里适用于CQRS模型?
考虑提交给我的应用程序服务的信息只包含服务必须解析以构建域对象的一系列ID值的情况.例如,请求包含分配给运行的信使的ID#.服务必须根据ID值查找实际的Courier对象,并使用AssignCourier方法(验证信使并执行其他业务逻辑)将对象分配给NewRun.
另一个问题是,鉴于查询分离和可能缺少存储库,应用程序服务如何执行查找以查找Courier域对象?
UPDATE
根据丹尼斯评论后的一些额外阅读和思考,我将重新解释我的问题.
在我看来,CQRS鼓励仅仅是数据访问和数据存储机制的外观的存储库.它们给出了一个集合的"外观"(如Fowler描述的那样),但并没有在内存中管理实体(正如Dennis指出的那样).这意味着存储库上的每个操作都是直通的,是吗?
工作单位如何适应这种方法?通常,UoW用于提交对存储库所做的更改(对吗?),但如果存储库没有将实体维护在内存中,那么UoW有什么作用?
关于"写入"操作,命令处理程序是否会引用相同的存储库,不同的存储库或者可能是UoW而不是存储库?
我试图让System.Runtime.Caching命名空间中包含的新SqlChangeMonitor功能工作,并得到一些意想不到的结果.
我有一个简单的控制台应用程序设置为:
static void Main(string[] args)
{
var cacher = new Cacher();
cacher.Start();
Console.WriteLine("Watching for changes...");
while (true)
{
if (cacher.HasData)
{
Console.Write(".");
Thread.Sleep(1000);
}
else
{
Console.WriteLine();
Console.WriteLine("Cache EMPTY!");
Console.ReadLine();
cacher.Start();
}
}
}
Run Code Online (Sandbox Code Playgroud)
Cacher类定义为:
public class Cacher
{
private MemoryCache cache = new MemoryCache("test");
public Boolean HasData
{
get { return cache.Contains("data"); }
}
public void Start()
{
var connectionString = "Data Source=.;Initial Catalog=CachingTest;Integrated Security=True";
var list = new NameValueCollection();
var policy = new CacheItemPolicy();
SqlDependency.Start(connectionString);
using (var …
Run Code Online (Sandbox Code Playgroud) 我有一个长期运行的任务,我使用任务并行库实现.当Task启动时,我抓取几个输入值和集合的快照,然后使用该信息执行各种操作.如果在任务运行时这些值或集合中的任何一个发生了变化,我希望在完成后立即再次运行任务.我应该创建一个新任务还是有办法重用现有的任务?开始第二次迭代的最佳方法是什么?
我试图从以数据为中心的设计和开发跳转到DDD并阅读了Evans和Nillson,但我仍然无法理解我应该如何构建我的域层.我确信我当前项目的性质没有帮助!
一点背景
该应用程序是管理人员评估的内部解决方案.人力资源人员将创建评估"模板",其中包含一组问题,团队负责人和管理人员要为每个直接报告完成这些问题.答案将持续进行审核和审核.这些评估可以用于各种各样的事情,例如公司计划的反馈,绩效评估等.
以数据为中心的一面
不是为了影响解决方案而是突出我以数据为中心的思维方式,我已经对数据库架构有了一个愿景,并将其包含在这里仅供参考(因为图片说千言万语):
正如预期的那样,模式被标准化,并且与我的应用程序中的数据处理方式不匹配.而且,我已经省略了查找表等,试图将问题保持在最低限度.
用例
第一个用例是检索和显示用户需要完成的评估列表.这将在用户首次登录应用程序时显示,并且最初似乎相对容易,但有两个问题:1 - 评估是基于时间的,因此可能需要每月,每年或每个'x'根据员工周年日的年数; 并且,2 - 用户可以保存正在进行的评估并在以后完成.因此,列表应包含到期的评估以及正在进行的评估.
接下来,当用户选择要执行的评估时,我需要检索该评估的所有问题(当前版本),以便我可以将它们显示给用户.在评估期间的任何时候,用户可以保存当前结果.只有在整个评估完成后,才能实际"提交" - 或承诺.
第三,人力资源需要一种方法,通过主管提供的响应重新生成评估.
最后,人力资源部门能够创建和修改评估 - 并对其进行版本控制.因此,每当有人修改评估时,都会创建一个新版本,并且该版本将成为执行的任何新评估的模板(任何正在进行的评估将继续使用其原始模板).
领域模型
按顺序工作,对我来说,我将有一个评估实体,它是一个聚合根,以满足第四个用例.它将具有Section实体的子集合,而这些子集合将具有Question实体的子集合.他们都是实体,因为他们有身份(是吗?).评估是消费代码用于持久性,验证等的对象(尽管Section和Question实体验证自己并将状态汇总到根评估).我的目标是从消费者那里制作版本抽象,并在数据持久层中实现它(好的或坏的想法?)
这意味着我还将拥有一个为我处理持久性的AssessmentRepository,并且可能还有一个在需要时创建新评估的AssessmentFactory.
更大的问题来自其他用例.我是否还有EmployeeAssessment Aggregate root?或者它只是一个实体?
查看用例,我需要以两种方式使用此信息.首先,当我生成要向用户显示的评估列表时,我不仅要根据评估频率评估直接报告列表,而且还需要知道我是否已经开始和/或完成评估对那个雇员.这来自EmployeeAssessments表.另一种情况是当用户实际执行评估时,我正在与EmployeeAssessments和Responses表进行交互.
从UI的角度来看,当用户执行评估时,他们对内部数据结构等一无所知.我需要为UI提供该评估的问题列表,以显示并接受要保留的响应列表.这会导致第二个根带有附带的存储库等吗?
第三个用例类似,因为人力资源部门希望能够在以后通过回复重新生成评估.但是,我认为在执行评估时使用的相同过程可以在这里使用,因为恢复现有评估将需要相同的数据,唯一的区别是读/写能力与HR的只读.
把它包起来!
好吧,我已经絮絮叨叨地认为我已经清除了我的脑袋网.我欣赏任何方向,建议,批评等等.正如我所说,我正在试图跳跃并认为我理解这些概念,现在这是应用它们的问题.谢谢!!!
我正在实现一个RESTful服务,其安全模型需要三个级别的授权:
实施资源级授权是直截了当的; 但是,其他两个不是.我相信实例级授权的解决方案将通过解决(更难的,imo)属性级授权问题来展示自己.后一个问题很复杂,因为我需要通过属性在响应消息(ala hypermedia)中传递授权决策 - 换句话说,这不是我可以简单地在属性设置器中强制执行的.
对于每个服务请求,我必须使用当前用户的信息来执行这些授权检查.对于资源列表或单个资源的GET请求,我需要告诉API层当前用户可以看到哪些属性(可见)以及该属性是只读还是可编辑.然后,API层将使用此信息来创建适当的响应消息.例如,任何不可见的属性都不会包含在消息中.将标记只读属性,以便客户端应用程序可以为用户呈现处于适当状态的属性.
应用程序服务,方面等解决方案非常适用于资源级别的授权,甚至可以用于实例级别的检查,但我很难确定如何最好地建模我的域,以便包含强制执行安全约束的业务规则和检查.
注意:请记住,这超出了基于角色的安全性,因为我使用资源和环境的当前状态(以及使用通过当前用户授予的权限验证访问权限)获取基于业务规则的最终授权结果他们的角色).
我应该如何建模域名,以便执行所有三种类型的授权检查(以可测试的方式,使用DI等)?
我有兴趣编写一个方法,接受另一个方法作为参数,但不想被锁定到特定的签名 - 因为我不关心这一点.我只对该方法在调用时是否抛出异常感兴趣..NET Framework中是否有一个构造允许我接受任何委托作为参数?
例如,以下所有调用都应该有效(不使用重载!):
DoesItThrowException(doSomething(arg));
DoesItThrowException(doSomethingElse(arg1, arg2, arg3, arg4, arg5));
DoesItThrowException(doNothing());
Run Code Online (Sandbox Code Playgroud) 我试图去学习和应用CQRS设计方法(模式和体系结构)到一个新的项目,但似乎缺少一个关键部分.
我的客户端应用程序执行查询并从读取模型中检索轻量级只读DTO列表.用户选择一个项目并单击按钮以启动某个操作.通过创建相应的命令对象并将其发送到写入模型(命令处理程序执行操作,更新数据存储等等)来执行操作.但是,在某些时候,我需要更新UI以反映对该行动产生的申请状态.
用户界面如何知道什么时候刷新原始列表?
附加信息
我注意到大多数讨论CQRS的文章/博客都在他们的例子中使用MVC客户端应用程序.我现在正在开发一个Silverlight客户端,并开始怀疑该模式在这种情况下是否起作用.
后续问题
在更多地考虑了Bartlomiej的回应和随后的讨论之后,我想知道CQRS中的错误处理.鉴于命令基本上是即发即弃的异步操作,我们如何向UI报告错误情况?
我看到'刷新UI'采取以下两种形式之一:
即使在MVC中使用Post-Redirect-Get模式,在知道操作结果之前,您也无法真正重定向.到目前为止,我见过的所有例子都没有解决这些现实问题.
作为Visual Studio 2010(主要是C#4.0)开发标准的一部分,我们启用了代码分析.当我正在审查最近为新项目提交的代码时,我看到了很多
CA2000:Microsoft.Reliability:在方法'XYZ'中,对象'ABC'不沿所有异常路径放置.在对所有引用超出范围之前,调用System.IDisposable.Dispose对象'ABC'.
警告.问题是,我所做的一切似乎都没有消除警告 - 我花了几个小时搜索网络并尽我所能.
首先,让我明确一点,我不是在谈论将一个简单的使用块放入正确处理局部变量 - 这不是问题.在我的情况下,当对象由方法返回或分配给方法中的另一个对象时,会出现这些警告.
这是一个代码示例,其中包含四个此类警告:
public void MainMethod()
{
var object1 = CreateFirstObject(); // Warning here
var object2 = CreateSecondObject(); // Warning here
SomeCollectionProperty.Add(object1);
SomeCollectionProperty.Add(object2);
}
private SomeObject CreateFirstObject()
{
var theObject = new SomeObject() // Warning here
{
FirstProperty = "some value",
// ...
};
return theObject;
}
private SomeOtherObject CreateSecondObject()
{
var theObject = new SomeOtherObject() // Warning here
{
FirstProperty = "a different value",
// ...
};
return theObject;
}
Run Code Online (Sandbox Code Playgroud)
我已经评论了警告发生的地方. …
我正在尝试配置 Swashbuckle,以便可以使用 URL {root}/swagger.json 访问生成的 JSON 文件。
我已经操纵了许多设置,但一直无法让它工作。这里有些例子:
// This works! JSON file is located at http://{root}/swagger/docs/v1
this.EnableSwagger(c =>
{
c.RootUrl(x => baseUrl);
c.SingleApiVersion("v1", title);
}).EnableSwaggerUi();
This works! JSON file is located at http://{root}/swagger/docs/swagger
this.EnableSwagger(c =>
{
c.RootUrl(x => baseUrl);
c.SingleApiVersion("swagger", title);
}).EnableSwaggerUi();
// This does not work. JSON file is located at http://{root}/swagger
this.EnableSwagger("{apiVersion}", c =>
{
c.RootUrl(x => baseUrl);
c.SingleApiVersion("swagger", title);
}).EnableSwaggerUi();
// This does not work. JSON file is located at http://{root}/foo/swagger
this.EnableSwagger("foo/{apiVersion}", c =>
{
c.RootUrl(x …
Run Code Online (Sandbox Code Playgroud) .net ×4
c# ×2
cqrs ×2
.net-4.0 ×1
caching ×1
delegates ×1
idisposable ×1
msbuild ×1
nuget ×1
rest ×1
security ×1
swagger ×1
swagger-ui ×1
swashbuckle ×1