小编Eri*_*kel的帖子

消除代码切换的方法

有什么方法可以消除代码中交换机的使用?

design-patterns

170
推荐指数
9
解决办法
12万
查看次数

ASP.NET MVC中单独程序集中的视图

我正在尝试创建一个web应用程序,我希望能够插入单独的程序集.我正在使用MVC预览4和Unity结合依赖注入,我用它来从我的插件程序集创建控制器.我正在使用WebForms(默认的aspx)作为我的视图引擎.

如果我想使用一个视图,我会坚持核心项目中定义的视图,因为ASPX部分的动态编译.我正在寻找一种将ASPX文件封装在不同程序集中的正确方法,而无需完成整个部署步骤.我错过了一些明显的东西吗 或者我应该以编程方式创建我的观点?


更新:我改变了接受的答案.尽管戴尔的答案非常彻底,但我还是选择了不同的虚拟路径提供商.它的工作方式就像一个魅力,我认为完全只需要20行代码.

c# asp.net-mvc plugins

51
推荐指数
3
解决办法
3万
查看次数

放在ViewModel中的内容

你在视图中放了什么?

最近博客斯科特Hanselman的有关使用一个特殊的模型绑定,方便测试使我想到了以下几点:你放什么在你的控制器逻辑构建视图模型,哪些应放在有何看法?他做的是这样的:

var viewModel = new DinnerFormViewModel {  
    Dinner = dinner,  
    Countries = new SelectList(PhoneValidator.Countries, dinner.Country)  
};  
return View(viewModel);
Run Code Online (Sandbox Code Playgroud)

现在,我使用相同的方式将数据传递给我的视图,但我不确定他如何处理Countries属性.您可以争辩双方:在SelectList中包装Country列表会为视图准备数据,就像创建一个viewmodel DTO来传递数据一样.另一方面,它有点像你专门操作下拉列表中使用的数据,限制了视图处理来自控制器的数据的方式.我觉得这对于视图和控制器之间的关注点分离是一个灰色区域,我无法真正决定走哪条路.对此有什么最佳做法吗?

PS:为了简单起见,让我们假设默认的ASP.NET MVC上下文,所以基本上你的开箱即用项目.默认视图引擎和所有爵士乐.

asp.net-mvc separation-of-concerns

14
推荐指数
2
解决办法
4529
查看次数

IIS中的WCF,在工作组模式下使用MSMQ

我一直在尝试使用WCF进行MSMQ,但我似乎无法让它正常工作.通过使用WCF和服务引用,我得到了客户端(它向队列发送消息).执行此操作的代码或多或少是这样的:

static void Main(string[] args)
{
    var client = new MsmqServiceReference.MsmqContractClient();
    client.SendMessage("TEST");
    client.Close();
    Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)

其中MsmqContractClient是我添加服务引用时由visual studio生成的代理.app.config中的端点指向msmqueue:

<client>
  <endpoint 
    address="net.msmq://localhost/private/MsmqService/MsmqService.svc"
    binding="netMsmqBinding"  
    bindingConfiguration="MsmqBindingNonTransactionalNoSecurity"
    contract="MsmqServiceReference.IMsmqContract" name="MsmqService" />
</client>
Run Code Online (Sandbox Code Playgroud)

这样可以将消息发布到队列中.

现在我试图让服务真正起作用,但我一直收到这个错误:

绑定验证失败,因为绑定的MsmqAuthenticationMode属性设置为WindowsDomain但安装了MSMQ且禁用了Active Directory集成.无法打开通道工厂或服务主机.

我尝试过的事情是:

  • 为每个人提供对队列的完全访问权限(包括匿名登录)

  • 使用以下命令配置应用程序以使用配置文件中的特定绑定:

    <bindings>
      <netMsmqBinding>
         <binding name="MsmqBindingNonTransactionalNoSecurity" 
                  deadLetterQueue="Custom" 
                  exactlyOnce="false">
           <security mode="None" />
         </binding>
      </netMsmqBinding>
    </bindings>
    
    Run Code Online (Sandbox Code Playgroud)
  • 我尝试在我自己的帐户和管理员帐户下运行IIS(7)中的应用程序池

让我感到困惑的是,它一直试图说服我,我正在尝试使用WindowsDomain身份验证来运行它.我声明我不想在安全模式设置为none的情况下这样做,对吗?

我的应用程序目前只是一个webforms asp.net网站,其中添加了WCF服务.

如果有人能够至少指出我正确的方向,我将非常感激,因为我已经花了太多时间在这上面.


看起来似乎忽略或覆盖了配置.完整的错误消息:

WebHost failed to process a request.
 Sender Information: System.ServiceModel.Activation.HostedHttpRequestAsyncResult/63721755
 Exception: System.ServiceModel.ServiceActivationException: The service '/MsmqService/MsmqService.svc' cannot be activated due to an exception during compilation.  The exception message is: Binding validation …
Run Code Online (Sandbox Code Playgroud)

c# iis wcf msmq

12
推荐指数
1
解决办法
8920
查看次数

测试梯形逻辑

我们都知道测试OO系统的各种方法.但是,看起来我将要做一个我将处理PLC梯形图逻辑的项目(不要问:/),我想知道是否有一种很好的方法来测试系统的有效性.

到目前为止,我看到的唯一方法就是构建一个包含系统所有已知状态的巨大表,以及生成的输出状态.对于简单的'如果输入A打开,则在'情况下转动输出B'.我认为这不适用于更复杂的结构.

testing logic plc

10
推荐指数
1
解决办法
4509
查看次数

许多线程或尽可能少的线程?

作为一个侧面项目,我正在为一个我曾经玩过的古老游戏编写服务器.我试图让服务器尽可能松散耦合,但我想知道什么是多线程的好设计决策.目前我有以下一系列行动:

  • 启动(创建) - >
  • 服务器(侦听客户端,创建) - >
  • 客户端(侦听命令并发送期间数据)

我假设平均有100个客户,因为这是游戏任何给定时间的最大值.对于整个事物的线程,什么是正确的决定?我目前的设置如下:

  • 服务器上的1个线程侦听新连接,在新连接上创建客户端对象并再次开始侦听.
  • 客户端对象有一个线程,侦听传入命令并发送定期数据.这是使用非阻塞套接字完成的,因此它只检查是否有可用的数据,处理该数据然后发送已排队的消息.登录在发送 - 接收周期开始之前完成.
  • 一个线程(现在)用于游戏本身,因为我认为从架构上讲,它与整个客户端 - 服务器部分是分开的.

这将导致总共102个线程.我甚至考虑给客户端2个线程,一个用于发送,一个用于接收.如果我这样做,我可以在接收器线程上使用阻塞I/O,这意味着线程在平均情况下将大部分处于空闲状态.

我主要担心的是,通过使用这么多线程,我将占用资源.我并不担心竞争条件或死锁,因为这是我无论如何都要处理的事情.

我的设计是这样设置的,我可以使用单个线程进行所有客户端通信,无论它是1还是100.我已将通信逻辑与客户端对象本身分开,因此我可以实现它而无需重写很多代码.

主要问题是:在应用程序中使用超过200个线程是错误的吗?它有优势吗?我正在考虑在多核机器上运行它,它会像这样多个核心占用很多优势吗?

谢谢!


在所有这些线程中,大多数线程通常会被阻塞.我不认为连接速度超过每分钟5次.来自客户端的命令很少会出现,我平均说每分钟20个.

按照我得到的答案(上下文切换是我正在考虑的性能打击,但我不知道,直到你指出它,谢谢!)我想我会采用一个听众,一个方法接收者,一个发送者和一些杂项;-)

language-agnostic multithreading client-server

10
推荐指数
3
解决办法
1354
查看次数

在每次webservice调用之前调用某个方法

这是情况.我有一个webservice(C#2.0),它主要由一个继承自System.Web.Services.WebService的类组成.它包含一些方法,所有方法都需要调用一个方法来检查它们是否被授权.

基本上是这样的(原谅架构,这纯粹是一个例子):

public class ProductService : WebService
{
    public AuthHeader AuthenticationHeader;

    [WebMethod(Description="Returns true")]
    [SoapHeader("AuthenticationHeader")]        
    public bool MethodWhichReturnsTrue()
    {
        if(Validate(AuthenticationHeader))
        {
            throw new SecurityException("Access Denied");
        }
        return true;
    }

    [WebMethod(Description="Returns false")]
    [SoapHeader("AuthenticationHeader")]        
    public bool MethodWhichReturnsFalse()
    {
        if(Validate(AuthenticationHeader))
        {
            throw new SecurityException("Access Denied");
        }
        return false;
    }

    private bool Validate(AuthHeader authHeader)
    {
        return authHeader.Username == "gooduser" && authHeader.Password == "goodpassword";
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,Validate必须在每种方法中调用该方法.我正在寻找一种能够调用该方法的方法,同时仍然能够以理智的方式访问soap标头.我看过那里的事件global.asax,但我认为我不能访问该课程中的标题......我可以吗?

.net c# web-services

8
推荐指数
1
解决办法
4639
查看次数

使用ANTLR解析CSS - 边缘情况

我正在尝试使用ANTLR解析CSS,或者至少是基础知识.我的lexer规则遇到了一些问题.问题在于ID选择器和十六进制颜色值之间的模糊性.为清晰起见,使用简化的语法,请考虑以下输入:

#bbb {
  color: #fff;
}
Run Code Online (Sandbox Code Playgroud)

以及以下解析器规则:

ruleset : selector '{' property* '}';
selector: '#' ALPHANUM;
property: ALPHANUM ':' value ';' ;
value: COLOR;
Run Code Online (Sandbox Code Playgroud)

和这些词法分析器:

ALPHANUM : ('a'..'z' | '0'..'9')+;
COLOR : '#' ('0'..'9' | 'a'..'f')+;
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为#bbb被标记为COLOR标记,即使它应该是一个选择器.如果我将选择器更改为不以十六进制字符开头,则它可以正常工作.我不知道如何解决这个问题.有没有办法让ANTLR将特定令牌仅作为COLOR令牌处理,如果它在某个位置?比方说,如果它属于属性规则,我可以放心地认为它是一个颜色标记.如果不是,请将其视为选择器.

任何帮助,将不胜感激!


解决方案:原来我试图在语法中做太多,我应该在使用AST的代码中处理.CSS有太多不明确的令牌可靠地分成不同的令牌,所以我现在使用的方法基本上是对'#','.',':'和花括号等特殊字符进行标记,并在消费者代码.工作得更好,处理边缘情况更容易.

css antlr css-parsing

8
推荐指数
1
解决办法
1754
查看次数

使用Dapper和SQL Spatial Types作为参数

我有一个基本上必须做这样的查询的系统:

SELECT * FROM MyTable WHERE @parameter.STIntersects(MyGeometryColumn)
Run Code Online (Sandbox Code Playgroud)

使用vanilla SQL参数时这很简单,你只需要以非典型的方式创建参数(其中builder变量是我用来创建矩形的SqlGeometryBuilder):

command.Parameters.Add(new SqlParameter
{
    UdtTypeName = "geometry",
    Value = builder.ConstructedGeometry,
    ParameterName = "@paremeter"
});
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试使用dapper这样做时,我得到一个错误,它无法弄清楚如何将其用作参数.任何有这个工作的人,或者有关如何启用此功能的任何指示?我有一个解决方法,但这涉及使用字符串表示并将其转换为我的SQL查询中的几何类型.我真的不想那样.

要回答评论,我得到的错误是'Microsoft.SqlServer.Types.SqlGeometry类型的成员参数不能用作参数值'.换句话说,dapper不知道如何将SqlGeometry对象作为参数处理.

orm spatial sql-server-2008 dapper

8
推荐指数
2
解决办法
4215
查看次数

Ninject.Web.MVC + MVC3抛出StackOverflowException

我有一个使用ASP.NET MVC3和Ninject.Web.MVC(MVC3版本)的简单Web应用程序.

整个过程正常,除非应用程序结束.每当它结束时,就会释放内核,如NinjectHttpApplication中的Application_End()所示:

反射器告诉我这个:

public void Application_End()
{
    lock (this)
    {
        if (kernel != null)
        {
            kernel.Dispose();
            kernel = null;
        }
        this.OnApplicationStopped();
    }
}
Run Code Online (Sandbox Code Playgroud)

发生的事情是我的网络服务器出现了StackOverflowException(我在VS2010中尝试了IIS7和内置的web服务器).我只能假设这是出错的地方,因为我自己没有在应用程序端编写任何代码.

我发现内核知道如何解析IKernel(它返回内核本身),这可能会导致堆栈溢出吗?我可以想象会发生这样的事情:

  • Kernel.Dispose()
  • 处理内核中的所有实例
  • 嘿!看看这个,内核也在内核中.返回第1步.

换句话说,内核被释放,处理它所拥有的所有引用(包括自引用),这会导致它自行处理.

这有意义吗?

编辑:

似乎问题出在NinjectHttpApplication中.看看这个激活码:

    public void Application_Start()
    {
        lock (this)
        {
            kernel = this.CreateKernel();
            ...
            kernel.Bind<IResolutionRoot>().ToConstant(kernel).InSingletonScope();
            ...
        }
    }
Run Code Online (Sandbox Code Playgroud)

看起来没问题,但现在发生的事情是每当调用IResolutionRoot时,内核都会缓存在自身内部.在处置内核时,清空缓存会释放所有缓存的对象,从而导致循环引用.

NinjectHttpApplication的一个简单解决方案是简单地更改绑定.将常量绑定更改为方法一:

kernel.Bind<IResolutionRoot>().ToConstant(kernel).InSingletonScope();
Run Code Online (Sandbox Code Playgroud)

kernel.Bind<IResolutionRoot>().ToMethod(x => this.Kernel);
Run Code Online (Sandbox Code Playgroud)

这解决了问题,但我不确定整个循环处置缓存问题是否是ninject中的错误.

c# asp.net-mvc ninject asp.net-mvc-3

7
推荐指数
1
解决办法
1395
查看次数