我需要创建一个线程安全的项目列表,以添加到lucene索引.
以下线程安全吗?
public sealed class IndexQueue
{
static readonly IndexQueue instance = new IndexQueue();
private List<string> items = new List<string>();
private IndexQueue() { }
public static IndexQueue Instance {
get { return instance; }
}
private object padlock = new object();
public void AddItem(string item) {
lock (padlock) {
items.Add(item);
}
}
}
Run Code Online (Sandbox Code Playgroud)
即使从内部列表中获取项目,是否还需要锁定?
我们的想法是,我们将运行一个单独的任务来从indexqueue中获取项目并将它们添加到lucene索引中.
谢谢Ben
我首先使用实体框架代码CTP4.
是否有可能像NH 3中那样延迟加载非导航属性.
一个常见的例子是拥有一个包含二进制列的表.我只想在我的代码中明确要求该属性时检索此列的数据,例如image.ImageData
谢谢Ben
我正在hijaxing现有的表单和POST到服务器.jQuery validate执行大部分验证,但如果验证在服务器上失败,我们将错误作为JSON返回给客户端.
以下是执行此操作的代码:
<script type="text/javascript">
$(function () {
$("form").submit(function (e) {
var $form = $(this);
var validator = $form.data("validator");
if (!validator || !$form.valid())
return;
e.preventDefault();
$.ajax({
url: "@Url.Action("index")",
type: "POST",
data: $form.serialize(),
statusCode: {
400: function(xhr, status, err) {
var errors = $.parseJSON(err);
validator.showErrors(errors);
}
},
success: function() {
// clear errors
// validator.resetForm();
// just reload the page for now
location.reload(true);
}
});
});
});
</script>
Run Code Online (Sandbox Code Playgroud)
问题是如果POST成功,我似乎无法清除验证错误.我已经尝试过呼叫,validator.resetForm()但这没有区别,showError()呼叫添加的错误消息仍然显示.
注意我也使用jQuery.validate.unobtrusive插件.
我一直在使用域事件模式 - 它使我们能够在域层中尽可能多地封装行为,并为我们的应用程序的其他部分订阅域事件提供了一种很好的方法.
目前我们正在使用一个静态类,我们的域对象可以调用它来引发事件:
static class DomainEvents
{
public static IEventDispatcher Dispatcher { get; set; }
public static void Raise<TEvent>(TEvent e)
{
if (e != null)
{
Dispatcher.Dispatch(e);
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这仅仅是一个IEventDispatcher实际执行调度或发布事件的垫片.
我们的调度程序实现只是使用我们的IoC容器(StructureMap)来定位指定类型的事件的事件处理程序.
public void Dispatch<TEvent>(TEvent e)
{
foreach (var handler in container.GetAllInstances<IHandler<TEvent>>())
{
handler.Handle(e);
}
}
Run Code Online (Sandbox Code Playgroud)
这在大多数情况下都可以.但是,这种方法存在一些问题:
仅在成功持久保存实体时才应分派事件
参加以下课程:
public class Order
{
public string Id { get; private set; }
public decimal Amount { get; private set; }
public …Run Code Online (Sandbox Code Playgroud) 我们为ASP.NET抛出的异常配置了以下自定义错误页面:
<customErrors mode="On" redirectMode="ResponseRewrite">
<error statusCode="400" redirect="~/400.aspx"/>
<error statusCode="404" redirect="~/404.aspx"/>
<error statusCode="500" redirect="~/500.aspx"/>
</customErrors>
Run Code Online (Sandbox Code Playgroud)
设置redirectMode="ResponseRewrite"很重要,因为它确保URL不会更改(我相信ASP.NET执行Server.Transfer而不是Response.Redirect).
不幸的是,这不适用于请求验证错误.例如,如果我导航到/some/page/<script>ASP.NET的请求验证启动并且HttpException抛出了a,则启用自定义错误.但是,我没有显示自定义错误页面,而是收到以下消息:
'/'应用程序中的服务器错误.
运行时错误
描述:处理您的请求时发生异常.此外,执行第一个异常的自定义错误页面时发生另一个异常.请求已终止.
为什么ASP.NET无法在此方案中显示我的自定义错误页面?错误页面中没有代码,只有HTML,所以我知道错误页面本身不会抛出任何异常.
此外,如果我自己捕获错误Application_Error并发出Server.Transfer它工作正常,所以我很好奇ASP.NET正在做什么.
如果我们要自己解决这个问题,那么有更好的解决方案吗?
protected void Application_Error(object sender, EventArgs e)
{
var ex = Server.GetLastError() as HttpException;
if (ex != null
&& ex.Message.StartsWith("A potentially dangerous Request.Path value was detected from the client")
&& HttpContext.Current.IsCustomErrorEnabled)
{
Server.Transfer("400.aspx");
}
}
Run Code Online (Sandbox Code Playgroud) 我在管理控制台中有一个无法部署的工作角色(在初始化和中止之间循环).它在模拟器中运行良好.
令人沮丧的是,部署失败了,它似乎几乎不可能找到原因.
我已经检查了所有连接字符串,启用了诊断程序,检查了我所有的程序集已部署,googled ALOT并丢失了一些头发.
我现在的观点是,我一点一点地添加代码,并重新部署以找到失败的代码,这个过程非常缓慢.
worker本身连接到sql azure和azure存储.我把它连接到模拟器中的实时端点没有任何问题.
配置StructureMap(IoC)后,它似乎失败了.但是,我在我的网络角色中使用几乎相同的代码,这很好.
那我在哪里可以从这里(除了瓶子)?
获取现有表单的当前jQuery验证器对象的正确方法是什么?
注意,验证器是使用jQuery Unobtrusive验证插件配置的,因此我没有对它的引用.
这一般适用于ASP.NET,但也适用于Web API.
如何在不启用RAMMFAR(RunAllManagedModulesForAllRequests)的情况下处理PUT/DELETE谓词.
我无法在IIS中配置处理程序映射,因为我的站点托管在Azure Web角色上,并且我所做的任何更改都不会保留.
我一直在玩ASP.NET MVC RC2中的DI支持.
我已经为NHibernate的每个请求实现了会话,并且需要注入ISession我的"工作单元"动作过滤器.
如果我直接引用StructureMap容器(ObjectFactory.GetInstance)或使用DependencyResolver来获取我的会话实例,一切正常:
ISession Session {
get { return DependencyResolver.Current.GetService<ISession>(); }
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试使用我的StructureMap过滤器提供程序(继承FilterAttributeFilterProvider),我在请求结束时提交NHibernate事务时遇到问题.
就像ISession在请求之间共享对象一样.我经常看到这一点,因为我的所有图像都是通过MVC控制器加载的,因此我在正常页面加载时创建了20个左右的NHibernate会话.
我在动作过滤器中添加了以下内容:
ISession Session {
get { return DependencyResolver.Current.GetService<ISession>(); }
}
public ISession SessionTest { get; set; }
public override void OnResultExecuted(System.Web.Mvc.ResultExecutedContext filterContext) {
bool sessionsMatch = (this.Session == this.SessionTest);
Run Code Online (Sandbox Code Playgroud)
使用StructureMap过滤器提供程序注入SessionTest.
我发现在一个有20个图像的页面上,"sessionsMatch"对于2-3个请求是假的.
我对会话管理的StructureMap配置如下:
For<ISessionFactory>().Singleton().Use(new NHibernateSessionFactory().GetSessionFactory());
For<ISession>().HttpContextScoped().Use(ctx => ctx.GetInstance<ISessionFactory>().OpenSession());
Run Code Online (Sandbox Code Playgroud)
在global.asax中,我在每个请求结束时调用以下内容:
public Global() {
EndRequest += (sender, e) => {
ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
};
}
Run Code Online (Sandbox Code Playgroud)
这个配置线程安全吗?以前我使用自定义将依赖项注入到同一个过滤器中IActionInvoker.当我开始遇到上述问题时,这一直工作到MVC 3 RC2,这就是为什么我认为我会尝试使用过滤器提供程序.
任何帮助,将不胜感激. …
在这个例子中是否有更好的模仿协方差的方法?理想情况下我想做:
private IDictionary<string, ICollection<string>> foos;
public IEnumerable<KeyValuePair<string, IEnumerable<string>> Foos
{
get
{
return foos;
}
}
Run Code Online (Sandbox Code Playgroud)
但KeyValuePair<TKey, TValue>不是协变的.
相反,我必须这样做:
public IEnumerable<KeyValuePair<string, IEnumerable<string>>> Foos
{
get
{
return foos.Select(x =>
new KeyValuePair<string, IEnumerable<string>>(x.Key, x.Value));
}
}
Run Code Online (Sandbox Code Playgroud)
有更好/更清洁的方式吗?
c# ×3
asp.net ×2
azure ×1
c#-4.0 ×1
covariance ×1
iis ×1
keyvaluepair ×1
lucene.net ×1
messaging ×1
nhibernate ×1
ravendb ×1
structuremap ×1