我选择了建议解决方案的变体; 保持所有ICommandHandlers和IQueryHandlers可能是异步的并在同步情况下返回已解析的任务.尽管如此,我不想在Task.FromResult(...)所有地方使用,所以我为方便起见定义了一个扩展方法:
public static class TaskExtensions
{
public static Task<TResult> AsTaskResult<TResult>(this TResult result)
{
// Or TaskEx.FromResult if you're targeting .NET4.0
// with the Microsoft.BCL.Async package
return Task.FromResult(result);
}
}
// Usage in code ...
using TaskExtensions;
class MySynchronousQueryHandler : IQueryHandler<MyQuery, bool>
{
public Task<bool> Handle(MyQuery query)
{
return true.AsTaskResult();
}
}
class MyAsynchronousQueryHandler : IQueryHandler<MyQuery, bool>
{
public async Task<bool> Handle(MyQuery query)
{
return await this.callAWebserviceToReturnTheResult();
}
}
Run Code Online (Sandbox Code Playgroud)
遗憾的是C#不是Haskell ......还是8-).真的闻起来像 …
在使用这种方法一段时间后,我发现自己只在每个控制器中添加完全相同的样板代码,所以我决定做一些反射魔法.与此同时,我放弃使用MVC作为我的观点 - Razor是如此乏味和丑陋 - 所以我基本上使用我的处理程序作为JSON后端.我目前使用的方法是使用Route位于某个常见程序集中的属性来装饰我的查询/命令,如下所示:
[Route("items/add", RouteMethod.Post)]
public class AddItemCommand { public Guid Id { get; set; } }
[Route("items", RouteMethod.Get)]
public class GetItemsQuery : IQuery<GetItemsResponse> { }
// The response inherits from a base type that handles
// validation messages and the like
public class GetItemsResponse : ServiceResponse { }
Run Code Online (Sandbox Code Playgroud)
然后我实现了一个MVC主机,它提取带注释的命令/查询,并在启动时为我生成控制器和处理程序.有了这个,我的应用程序逻辑终于没有MVC了.查询响应也会自动填充验证消息.我的MVC应用程序现在看起来像这样:
+ MvcApp +- Global.asax +- Global.asax.cs - Startup the host and done +- Web.config
在意识到我真的不在主机之外使用MVC - 并且经常遇到框架所具有的bazillion依赖性问题 - 我实现了另一个基于NServiceKit的主机.在我的应用程序逻辑中没有什么必须改变,并且依赖关系到了System.Web, …
我的设置: 我在Visual Studio 2008中有一个C#应用程序(.NET 3.5).没有机会切换到WPF或者无论如何:).
我的应用程序包含一个自定义控件(从Windows.Forms.Button派生的按钮类),它可以替代Windows.Forms.TabControl.我可以将这些按钮相互关联,每个按钮可以与它正在处理的一个控件相关联(通常是某种类型的Windows.Forms.Panel).它看起来像这样:
public class TabButton : System.Windows.Forms.Button
{
// ...
protected override void OnClick(EventArgs e)
{
base.OnClick(e);
this.myAssociatedControl.Visible = true;
this.tellMyBuddiesToHideTheirControls();
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
基本上它只是单击一个按钮,显示其绑定控件并使绑定到相关按钮的控件消失 - 就像TabControl一样,但该方法很容易设计,我可以将按钮放在远离其内容面板的位置.
问题:
这在运行时非常有效,但在设计时的使用可以说是奇怪的:使用鼠标,找到属于该组的控件并运行一系列<Send To Back>s直到所需的控件可见.
问题: 有没有办法告诉VS设计师在设计时评估按钮的点击次数,就像使用TabControl一样,这样我就可以像在运行时一样点击它们来切换标签?
我一直在寻找相当长的一段时间.这里有一些文章,但它们似乎只是为了向属性设计师添加其他属性.
我在.NET4.0库中使用FluentNHibernate 1.4.0进行NHibernate 3.3.3-SP1映射.我正在为我的类型层次结构使用"table-per-inheritance"方法,如下所示:
-- Different process types potentially use
-- different types of reference values
CREATE TABLE ProcessTypes
(Id INT PRIMARY KEY)
-- Contains reference values for value comparisons
CREATE TABLE ProcessReferenceValues
(Id INT PRIMARY KEY IDENTITY(1,1),
ProcessTypeId INT FOREIGN KEY REFERENCES ProcessTypes(Id),
FloatReferencesValue FLOAT NULL,
IntReferenceValue INT NULL)
Run Code Online (Sandbox Code Playgroud)
// POCOs
class ProcessReferenceValues
{
public virtual int Id { get; set; }
public virtual ProcessTypes ProcessType { get; set; }
public virtual float? FloatReferenceValue { get; set; } …Run Code Online (Sandbox Code Playgroud) asp.net-mvc ×2
c# ×2
async-await ×1
c#-5.0 ×1
cqrs ×1
decorator ×1
design-time ×1
nhibernate ×1
orm ×1
winforms ×1