我的一些域对象包含日期范围作为一对开始和结束日期属性:
public class Period {
public DateTime EffectiveDate { get; set; }
public DateTime ThroughDate { get; set; }
}
public class Timeline {
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我发现自己有很多这样的事情:
abstract public int Foo(DateTime startDate, DateTime endDate);
abstract public decimal Bar(DateTime startDate, DateTime endDate);
abstract public ICollection<C5.Rec<DateTime, DateTime>> FooBar(DateTime startDate, DateTime endDate);
Run Code Online (Sandbox Code Playgroud)
最后一个让我想知道......我应该实现一个DateRange类吗?我不知道BCL中有一个.
根据我的经验,使对象层次结构更深入往往使事情复杂化.这些对象确实被发送到ReportViewer控件显示的RDLC报告,但这是次要的.我会将视图弯曲到模型而不是相反.但是,我们并不依赖于属性名称,并愿意与以下内容妥协:
public class DateRange {
public DateTime StartDate { get; set; }
public DateTime EndDate { get; …Run Code Online (Sandbox Code Playgroud) 对于这个长期的问题提前抱歉,很长一段时间因为我整天都在挖掘这个问题.
我有一个ASP.Net MVC2应用程序,其中包含以下项目:MyApp.Web,MyApp.Services,MyApp.Data.
我们编写接口代码并将Ninject 2用于DI/IoC.
但是,我对打字(并忘记打字)非常厌倦:
Bind<ISomeService>.To<SomeService>;
Run Code Online (Sandbox Code Playgroud)
所以,了解Ninject.Extensions.Convensions,我试图用它来自动扫描和注册模块和IXxxx => Xxxx类型的简单依赖项.
我可以使用以下代码来设置Ninject,并且所有内容似乎都按预期连接.
public static IKernel Initialize()
{
var kernel = new StandardKernel();
kernel.Scan(a => {
a.FromAssemblyContaining<MyApp.Data.SomeDataClass>();
a.FromAssemblyContaining<MyApp.Services.SomeServiceClass>();
a.AutoLoadModules();
a.BindWithDefaultConventions();
a.InTransientScope();
});
return kernel;
}
Run Code Online (Sandbox Code Playgroud)
但是......我想以一种我认为支持的方式进一步采取这一点,但我似乎无法让它发挥作用.
由于我们的MyApp.Web项目根本没有使用MyApp.Data(直接),我试图避免引用MyApp.Data.使用上面的代码,我必须从MyApp.Web引用MyApp.Data,因为对SomeDataClass的编译时引用.
我更愿意为Ninject 指定一个程序集的名称进行扫描和注册.看来,Conventions扩展通过带有字符串(或可枚举的字符串)的From重载来支持这一点.
所以,我在From重载上尝试了几种变体:
public static IKernel Initialize()
{
var kernel = new StandardKernel();
kernel.Scan(a => {
a.From("MyApp.Data");
a.From("MyApp.Services.dll");
a.From("AnotherDependency, Version=1.0.0.0, PublicKeyToken=null"); //etc., etc. with the From(...)'s
a.AutoLoadModules();
a.BindWithDefaultConventions();
a.InTransientScope();
});
return kernel;
} …Run Code Online (Sandbox Code Playgroud) 我对使用域事件构建读取模型的系统中的流程感到有些困惑.特别是,我们如何处理用户期望数据(及其视图)在完成命令时发生更改的事实,但由于我们的系统架构(对发布事件的非阻塞调用),实际数据库可能不会在页面重新加载?
我希望使用事件和服务总线将我们的一个系统的设计与CQRS更加一致.
让我们说我的流程是这样的:
用户单击"查看"中的按钮可执行从其帐户中删除付款方式的任务.
控制器调用PaymentMethodRemovalService,并将其传递给accountId和paymentMethodId.
Controller使用AccountRepository检索Account并调用account.RemovePaymentMethod(id)
帐户验证可以进行操作并发布事件PaymentMethodRemovedMessage(accountId,paymentMethodId)
因为事件发布是异步的,所以我们现在必须从服务返回并从控制器返回视图 - 但是我们的实际数据还没有更新!
处理程序IHandle <PaymentMethodRemovedMessage>,检测事件并从数据库中删除实际行
那么,一个人要做什么?
我可以简单地说,删除显示付款方式的div.这可能适用于AJAX场景,但如果我使用Post-Redirect-Get来支持非JavaScript客户端会怎样.然后我将触发我的Get并从查询端读取数据,可能在更新之前.
我是否只是显示一条通知,说明他们已提交删除付款方式的请求?(这似乎不友好,提交订单是有意义的,但不是,例如,更改地址).
有没有办法将实现更改协调为解耦异步事件并显示反映其当前更改的用户数据?
编辑:我的问题非常类似于CQRS,DDD同步报告数据库 我不得不说,那里给出的答案也提到了这里,有一点气味 - 争论用户界面显示一个带外的更新读取DB,可以这么说.我希望有点清洁.
domain-driven-design nservicebus cqrs event-sourcing domain-events
我经常不使用T4模板; 通常在我这样做时正在编辑其他项目(特别是SubSonic和T4MVC).经验总是令人不快(这也是我不经常使用它们的原因).
这些是我所知道的工具,它们都不符合要求.
我第一次尝试使用它时,我认为Visual Studio 2010已经崩溃了.结果我没等多久(编辑器窗口出现花了2分多钟).叫我挑剔,但这一点让我脱离了这个工具.
我有一个修改过的T4MVC模板.安装Tangible的T4编辑器后,模板失败并出现多个错误.如果我然后卸载Tangible的T4编辑器,模板将再次运行.因此,编辑器会改变Visual Studio中T4的行为.也许显然,这是完全不可接受的.
我错过了还有其他T4编辑吗?是否有其他人使用这些工具,遇到这些相同的问题,并成功使用它们?
我还应该说,对我来说最重要的功能就是区分作为模板一部分运行的代码和获得输出的代码/文本.其他一切都是肉汁.
在我传递给的操作内部调用FluentMigrator的构建器方法Execute.WithConnection会导致抛出空引用异常.
我要做的是选择一些数据,以便我可以在c#中操作它,因为这比在T-SQL中操作它更容易,并使用我的c#操作的结果来更新数据或插入新数据(是更具体地说,我需要从存储的url字符串中选择一个查询字符串参数并将其插入其他地方).
我在迁移中选择数据的唯一方法是自己使用Execute.WithConnection和检索数据(FluentMigrator没有提供用于选择数据的帮助程序),但是如果我尝试在动作中使用任何流畅的迁移器表达式,我将传递给Execute.WithConnection空引用异常是抛出.
这是我的代码的简化版本:
[Migration(1)]
public class MyMigration : Migration
{
public void Up()
{
Execute.WithConnection(CustomDml);
}
public void CustomDml(IDbConnection conn, IDbTransaction tran)
{
var db = new NPoco.Database(conn).SetTransaction(tran); // NPoco is a micro-ORM, a fork of PetaPoco
var records = db.Fetch<Record>("-- some sql"); // this is immediately evaluated, no reader is left open
foreach (var r in records) {
var newValue = Manipulate(r.OriginalValue);
Insert.IntoTable("NewRecords").Row(new { OriginalValueId = r.Id, NewValue = newValue }); // …Run Code Online (Sandbox Code Playgroud) 我目前正在遇到这里提到的问题(以及其他几个地方):Subsonic 3 Linq Projection Issue
这是使用3.0.0.4发行包发生的,当我从GitHub获取最新版本并构建它时也会发生这种情况.
我正在使用LINQ模板.
我有这个代码:
var newModel = new ViewModels.HomeIndexViewModel() {
PulseListViewModel =
new ViewModels.PulseListViewModel
{
Pulses = from p in _pulseQuery
join a in _accountQuery on p.AccountId equals a.AccountId
orderby p.CreateDate descending
select new PulseListViewModel.Pulse()
{
AccountName = a.Name
, Category = p.Category
, CreateDate = p.CreateDate
, Link = p.Link
, Message = p.Message
, Source = p.Source
, Title = p.Title
}
}
};
Run Code Online (Sandbox Code Playgroud)
但AccountName始终为null.
如果我将AccountName更改为Name:
var newModel = new ViewModels.HomeIndexViewModel() {
PulseListViewModel …Run Code Online (Sandbox Code Playgroud) 我们使用Quartz.Net来安排大约200个重复工作.每个作业使用相同的IJob实现类,但它们可以具有不同的日程表.在实践中,他们最终有相同的时间表,因此我们有大约200个工作细节,每个细节都有自己的(相同的)重复/简单触发器,已安排.间隔是一个小时.
此作业执行的任务是下载rss源,然后下载链接到rss源中的所有媒体文件.在下载之前,它会擦除放置文件的目录.单次运行需要几秒到十几秒(偶尔会更多).
我们的调度方法是在新的StdSchedulerFactory上调用GetScheduler()(所有作业一次调度到同一个IScheduler实例中).我们通过立即Start()来遵循调度.
工作似乎运行良好,但经过仔细检查,我们发现偶尔 - 或几乎从未 - 运行的少数工作.
因此,例如,所有200个工作岗位应该在今晚6点40分运行.大多数人都这样做了.但少数没有.我通过查看文件时间戳来确定这一点,如果作业运行,它肯定会更新(因为它删除并重新下载文件).
我已经启用了Quartz.Net日志记录,并且还为我们的代码添加了很多日志记录语句.
我得到了一些日志消息,表明Quartz正在创建并执行一轮工作开始后大约一分钟的工作.
之后,所有活动都会停止.没有作业运行,也没有创建日志消息.零.
然后,在下一个发射间隔,Quartz再次启动,我的日志文件更新,各种文件开始下载.但是 - 它肯定看起来像一些JobDetail实例永远不会成为行的首脑(可以这么说)或者很少这样做.在整个周末,一些工作似乎经常更新,最近,其他人自周五开始流程后没有更新一次(它运行在Windows服务shell,顺便说一下).
所以...我希望有人可以帮助我理解Quartz的这种行为.
我需要确定每个工作都在运行.如果错过了触发器,我需要Quartz尽快运行它.通过阅读文档,我认为这将是默认行为 - 对于具有无限重复计数的SimpleTrigger,如果错过触发器窗口,它将重新安排作业以立即执行.似乎并非如此.有什么方法可以确定为什么Quartz没有解雇这些工作?我正在跟踪级别,他们只是不在那里.它创建并执行了大量的工作,但如果我注意到一个缺失 - 我可以找到的是它最后一次运行它(例如,有时它没有运行数小时或数天).没有关于它被跳过的原因(我希望Quartz能够记录某些内容,如果它因任何原因而跳过某个工作),等等.
任何帮助真的,真的很感激 - 我花了一整天时间试图解决这个问题.
我在寻找匹配路线方面遇到了一些麻烦.
我使用base-32编码的int作为Web应用程序中幻灯片的短链接.每个幻灯片有5个不同版本,我使用首字母来区分每个版本.
路由始终匹配,除非base-32编码的int的第一个字符与指定幻灯片版本的字符相同.所有5个前缀字母都存在此异常:n,f,c,x和h.
前两个字符相同会使这些路线不匹配?我无法理解这里发生了什么(当路线不匹配时,它们只会达到默认值).
路线匹配(/na0):

路线不匹配(/nn0):

路线匹配(/nfg):

路线不匹配(/ffg):

我很难过.这是路由代码,如果在屏幕截图中的RouteDebug表中不清楚:
routes.MapRoute(
"NonBrandedSlideshow",
"n{id}",
MVC.Slideshow.NonBranded(), null,
new { id = Settings.Base32Regex }
);
routes.MapRoute(
"FullSlideshow",
"f{id}",
MVC.Slideshow.Full(), null,
new { id = Settings.Base32Regex }
);
routes.MapRoute(
"CompactSlideshow",
"c{id}",
MVC.Slideshow.Compact(), null,
new { id = Settings.Base32Regex }
);
routes.MapRoute(
"FlexibleSlideshow",
"x{id}",
MVC.Slideshow.Flexible(), null,
new { id = Settings.Base32Regex }
);
routes.MapRoute(
"Html5Slideshow",
"h{id}",
MVC.Slideshow.NonBrandedHtml5(), null,
new { id = Settings.Base32Regex }
);
Run Code Online (Sandbox Code Playgroud)
我在这里应该注意,我使用的是T4MVC(参见第2.2.5节),这些 …
我想拥有可以用我自己的自定义属性装饰的属性 getter 和方法,并根据该属性的存在用不同的实现替换方法主体。此外,不同的实现将需要知道赋予自定义属性的构造函数参数,它装饰方法。
这显然可以用 AOP 来完成,比如 PostSharp 或 LinFu,但我想知道是否有一种方法可以做到这一点,而不涉及构建后处理步骤,因为添加这比我更喜欢的项目复杂化。
我听说过PostSharp,但我想知道是否还有其他类似的工具 - 类似于PostSharp的东西?
是否有任何库可以用作PostSharp的替代品?任何其他可以后处理程序集并根据属性注入代码的工具?
PostSharp的任何免费和/或开源替代品都会特别有趣.
谢谢.
我有一个MVC3网络应用程序,它有效地"拴在"一个经典的ASP网站(即旧页面是经典的asp,新页面是ASP.Net MVC).该站点要求用户登录,因此为了保护新的MVC页面,我检查cookie并使用id从经典ASP登录页面创建的数据库中检索会话数据.
因为用户可以在旧页面和新页面之间切换,并且我不是在2个应用程序之间共享会话数据,所以我在我的操作方法LogIn中检查每个请求的cookie和检索数据:
public PartialViewResult LogIn()
{
var cookieId = DecodeCookieId(System.Web.HttpContext.Current.Request.Cookies["cookiename"].Value);
LoggedInViewModel viewModel = new LoggedInViewModel
{
Session = sessionRepository.Sessions.FirstOrDefault(s => s.GGAPSession_ID == cookieId)
};
return PartialView(viewModel);
}
Run Code Online (Sandbox Code Playgroud)
这将数据传递给ViewModel,ViewModel在每个MVC页面的顶部显示登录的用户名,这就是为什么我认为这是一个检查的好地方.
当我尝试修改LogIn()以检查cookie和重定向(如果未找到)时,会出现问题:
public ActionResult LogIn()
{
if (System.Web.HttpContext.Current.Request.Cookies["cookiename"] != null)
{
// same method contents as above
}
else
{
return Redirect("http://localhost/index.asp");
}
}
Run Code Online (Sandbox Code Playgroud)
我得到了一个'儿童行为不允许执行重定向行动',我理解,但我该如何绕过这个?我应该在其他地方进行cookie检查吗?我应该在哪里进行会话管理?
.net ×4
c# ×4
aop ×2
asp.net-mvc ×2
attributes ×1
cookies ×1
cqrs ×1
date-range ×1
linq ×1
model ×1
ninject ×1
nservicebus ×1
postsharp ×1
projection ×1
quartz.net ×1
routing ×1
subsonic ×1
subsonic3 ×1
t4 ×1
tuples ×1