我有一个类,我想访问我的IOC容器(Windsor),但我不想保持静态IWindsorContainer属性 - 我宁愿让容器注入任何需要IWindsorContainer的类中构造函数依赖项.
我已经用Unity取消了它,但是当我使用Windsor容器尝试相同的事情时,它告诉我IWindsorContainer没有在容器中注册.
我不认为我可以只注册IWindsorContainer => WindsorContainer,因为这将导致容器创建一个新的(或不同的)自身实例传递给我的类,并且该实例将不会注册所有其他类型它.我也没有看到构造容器的方法,注册其中的所有类型,然后针对IWindsorContainer注册自己的实例 - 所有注册方法只接受服务和实现的类型 - 从来不是实际的具体实例.
我有一个界面:
public abstract class Authorizer<T> where T : RequiresAuthorization
{
public AuthorizationStatus Authorize(T record)
{
// Perform authorization specific stuff
// and then hand off to an abstract method to handle T-specific stuff
// that should happen when authorization is successful
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我有一堆不同的类,它们都实现了RequiresAuthorization,相应地,Authorizer<T>
每个类都有一个(我的域中的每个业务对象在授权记录后都需要不同的逻辑来执行).
我也使用UnityContainer,我注册了各种各样Authorizer<T>
的.然后我有一些代码如下,从数据库中找到正确的记录并授权它:
void Authorize(RequiresAuthorization item)
{
var dbItem = ChildContainer.Resolve<IAuthorizationRepository>()
.RetrieveRequiresAuthorizationById(item.Id);
var authorizerType = type.GetType(String.Format("Foo.Authorizer`1[[{0}]], Foo",
dbItem.GetType().AssemblyQualifiedName));
dynamic authorizer = ChildContainer.Resolve(type) as dynamic;
authorizer.Authorize(dbItem);
}
Run Code Online (Sandbox Code Playgroud)
基本上,我正在使用对象上的Id从数据库中检索它.在后台,NHibernate负责确定它是什么类型的RequiresAuthorization.然后我想为它找到合适的Authorizer(我不知道在编译时Authorizer<T>
我需要什么实现,所以我有一点反思来获得完全限定类型).为了实现这一点,我使用UnityContainer的Resolve方法的非泛型重载来从配置中查找正确的授权器.
最后,我想在授权器上调用Authorize,传递我从NHibernate回来的对象.
现在,针对这个问题:
在VS2010的Beta2中,上面的代码完美无缺.在RC和RTM上,一旦我进行了Authorize()调用,我就得到一个RuntimeBinderException,说"最好的重载方法匹配 …
有没有办法看到(最好是通过内置的性能计数器)TPL已经排队等待它正在尝试通过多少工作?
以下是关于我正在尝试做什么以及我所看到的一些细节:
我有一个很大的工作负载,我正在使用Task.Factory.StartNew()(默认调度程序)卸载到.NET Threadpool.当负载超过我的系统可以处理的负载时,工作会排队,直到负载减少或内存不足.我确实更新了一个自定义性能计数器(它是一个每秒计数器)作为我处理的一部分,我可以看到这个计数器不会超过大约27 000(每秒消息数),无论我排队多少消息Task.Factory.StartNew().
我的问题更多的是关于监控而不是关于使系统性能更好的建议 - 我可以进行微优化,但目前在工作正在建立的性能计数器中没有可见性.除了优化之外,我希望能够确切地看到TPL已经缓冲了多少工作,纯粹是因为我可以衡量我的系统的响应能力.我希望看到在输入端添加新消息是否会导致立即处理(零延迟),或者在我看到我的请求的结果之前是否会有一些延迟.
现在发生的是每秒低于27 000条消息,如果我停止输入,我会看到"每秒处理的消息数"计数器降为零.在这个突破点之上,计数器继续每秒注册27k(取决于我积压积压的时间长度),直到其余的负载通过系统.
在我的开发笔记本电脑上,我只安装了VS2012 RC,并且我成功地从powershell(通过psake)挂钩到新的MSDeploy .pubxml管道(DeployOnBuild和PublishProfile设置),以将我的网站部署到我们的测试服务器.
但是,在我的构建服务器上,我最初安装了VS2010 SP1,而且我现在另外安装了2012 RC(我在这台机器上还有其他版本仍然是.NET 4).
当使用完全相同的参数运行相同的脚本时,我看到我的开发机器和构建服务器之间的结果不同.我正在运行的命令是
exec { msbuild "Website\WebSite.csproj" /m p:DeployOnBuild=True /p:PublishProfile=MyTestProfile }
Run Code Online (Sandbox Code Playgroud)
在构建服务器上,这实际上并不触发MSDeploy,而只是触发站点压缩并创建部署包的打包位.我的机器成功选择了pubxml文件并成功部署.
最后,我相信我已将问题追溯到文件Microsoft.Web.Publishing.targets.在我的开发机器上我只有
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\Web
Run Code Online (Sandbox Code Playgroud)
但服务器还有
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web
Run Code Online (Sandbox Code Playgroud)
看起来这个文件(不知道.pubxml的东西)就是那里使用的东西.
有没有人知道我需要翻动什么(最好在我自己的msbuild文件中,所以我不搞砸4.0版本的构建服务器上的任何其他东西)让msbuild拿起v11.0版本的文件和从而使用我的.pubxml文件?
我有一个用C#编写的现有库,它包含一个更低级别的TCP/IP API,并将来自服务器(专有二进制协议)的消息作为.NET事件公开.我还在一个对象上提供方法调用,该对象处理将方便的.NET类型(如System.DateTime)编组到API所需的二进制编码和固定长度结构(用于传递到服务器的消息)的复杂性.在这个.NET库之上构建了相当数量的现有应用程序(内部和第三方使用).
最近,我们已经找到了一个不想自己完成抽象TCP/IP的所有工作的人,但他们的环境严格来说不是Windows(我假设是*nix,但我不是100%肯定)他们已经暗示他们的理想是可以从Java调用的东西.
什么是支持他们要求的最佳方式,我不必:
我考虑过的一件事是将大部分核心TCP/IP功能重写为更多跨平台(C/C++),然后将我的.NET库更改为一个薄层(P /调用?),然后在它上面写一个类似的瘦Java层(JNI?).
优点:
缺点:
我简要考虑的另一个选择是以某种方式将Mono绑定到Java,以便我可以利用我已有的所有现有C#代码.尽管开发人员的体验对于那些不得不使用它的Java开发人员来说有多顺畅,但我并不太了解.我很确定大多数代码应该在Mono下运行没有问题(禁止解压缩P/Invoke,它应该只是移植到C#).
我理想情况下不想在我的代码和客户端Java应用程序之间添加另一层TCP/IP,管道等,如果我可以帮助它(因此WCF到Java端的WS-DeathStar可能已经出局).我从来没有用Java做过任何认真的开发,但我感到自豪的是,这个库目前是第三方开发人员整合到他的应用程序中的一块蛋糕(只要他当然运行.NET: )),我希望能够为任何想要相同体验的Java开发人员保持同样的易用性.
因此,如果有人对我提出的3个选项有意见(端口到Java并维护两次,移植到C并为.NET和Java编写瘦语言绑定,或者尝试集成Java和Mono),或者任何其他建议我'我喜欢听他们说话.
谢谢
编辑:在与客户的开发人员直接对话(即删除破碎的电话AKA销售部门)后,要求已经发生了很大变化,以至于这个问题不再适用于我的直接情况.但是,我会把问题保持开放,希望能够产生更好的建议.
在我的特定情况下,客户端实际上除了Solaris之外还运行Windows机器(现在还没有?)并且很高兴我们在库顶部编写应用程序(Windows服务)并提供更简化和更小的应用程序用于编码的TCP/IP API.我们将他们的简单消息转换为下游系统理解的格式,并将传入的响应转换回来供他们使用,以便他们可以通过他们的Java应用程序继续与这个下游系统连接.
在考虑了几周之后再回到原来的情景,我还有一些评论:
如果您事先知道需要支持多种语言/平台,那么可能是一种基于C语言的可移植库,其中包含不同的语言绑定.
在*nix上,单个进程可以同时托管Java运行时和Mono运行时吗?我知道在早期版本的.NET中你不能在同一个进程中有两个不同的.NET运行时,但我相信他们已经用.NET 4解决了这个问题?如果可能的话,两者之间如何沟通?理想情况下,您需要像静态方法调用这样简单的事情以及用于提升响应的委托.
如果Java和Mono(方法和委托等)之间没有简单的直接接口支持,可以考虑使用ZeroMQ和Protocol Buffers或Apache Thrift作为消息格式.由于ZeroMQ支持不同的传输,因此可以在进程内,进程间和网络上工作.
我有许多列表 - 每个列表包含9个浮点数.我真正需要做的是生成一个新列表,它从我的每个列表中获取第一个元素并将它们作为我的第一个元素添加在一起,然后将每个列表中的第二个元素添加为我的第二个元素,等等.
如此有效,如果我的数据看起来像这样:
List1 = [a1; b1; c1; d1; e1; f1; g1; h1; i1]
List2 = [a2; b2; c2; d2; e2; f2; g2; h2; i2]
...
Listn = [an; bn; cn; dn; en; fn; gn; hn; in]
Run Code Online (Sandbox Code Playgroud)
然后我需要生成一个新列表Listx
Listx = [a1 + a2 + ... + an; b1 + b2 + ... + bn; ... ]
Run Code Online (Sandbox Code Playgroud)
我将要合并的列表数量会有所不同(有时我可能只有一个包含9个数字的列表,有时超过100个列表,总共9个元素),所以我想知道是否有人对一个很好的惯用方式有任何建议这样做?
我也看看这个问题,并且这一个,但似乎都主张先索引我的元素,然后使用GROUPBY的一个中间步骤.这让我感到困惑,因为a)我觉得可能有一个更优雅的解决方案适用于我的特定情况和b)性能可能是一个问题以后 - 我不想过早优化,但我也不想拍自己在脚下.
我有一个mercurial存储库,有两个永久分支,默认和UAT.每隔一段时间,我们就会将新版本的应用程序部署(推广)到UAT环境中,我们通过将稳定的默认提交合并到UAT分支来实现.偶尔会在UAT分支中修复错误,这些错误修复会合并回默认值.
在UAT分支上,我需要为部署目的更改一些内容 - 连接字符串和各种环境设置.我试图做的是使在UAT分支这些变化,并承诺他们(所有为一个承诺),其合并成默认UAT之后.然后我将这一个提交虚拟合并到默认值 - 想法是因为默认现在在它的祖先中有这个提交将来错误修复从UAT合并到默认值将不会尝试重做这些特定于UAT的更改.
然而事情并没有像我希望的那样顺利.从虚拟合并提交开始到默认情况,我尝试了以下两种情况:
1) Make a few more commits to default and then "promote" to UAT (merge default onto UAT)
2) Make a bugfix on UAT and "backport" it to default (merge UAT onto default)
Run Code Online (Sandbox Code Playgroud)
在运行#1和#2之间,我已经将所有内容都删除,以便两个场景都从同一点开始.
我所看到的是,根据合并的最后一个方向,我仍然需要在执行一个或另一个合并并恢复之后检查已更改的文件 - 有时合并会尝试将默认配置放入UAT,有时将UAT配置放入合并.
如果我恢复配置更改并提交合并,那么将来在同一方向上的合并行为正常,但是当我走向另一个方向时,合并再次将错误的配置放入文件中.
我错过了什么?
我有一个每次调用的WCF服务,它在IIS(.svc)中托管.在服务的构造函数中,我根据本文设置了Thread.CurrentPrincipal = HttpContext.Current.User.在这种情况下,HttpContext.Current.User的类型为Microsoft.IdentityModel.Claims.ClaimsPrincipal,并具有从我的自定义被动STS发回的声明.
但是,只要我进入我的服务操作并检查Thread.CurrentPrincipal,当此对象仍然是Microsoft.IdentityModel.Claims.ClaimsIdentity类型时,该对象本身不再与HttpContext.Current.User相同(IsAuthenticated = false) ,AuthenticationType ="",并且Thread.CurrentPrincipal.Identity上的Name为null,而这些值仍然在HttpContext.Current.User上正确填充.这告诉我有些东西拦截了对操作的调用,并错误地将当前主体更改为一些通用的,空的,未经身份验证的声明主体.
我在构造函数和操作中检查了线程ID,并且它在两个地方都是相同的,并且在从HttpContext.Current.User分配后在立即窗口中评估Thread.CurrentPrincipal显示正在正确设置线程标识.构造函数,所以在构造函数和方法之间肯定会执行某些操作,并且有些东西正在改变我的Thread.CurrentPrincipal.
有没有人知道这是做什么的,以及如何防止/解决这种行为?
我有一个序列,我需要找到序列的最小值,以及序列中的值索引 - 实际上是Seq.mapi或Seq.iteri行中的某种"Seq.mini"函数.
在F#中表达这种最干净/最惯用的方式是什么?
在惯用法上,我是否应该期望编写一个返回元组(值,索引)或(索引,值)的函数,如果有的话,是否存在这些值应出现在哪个顺序的约定?
另一件事:如果有多个元素具有相同的最小值,我需要第一次出现的索引 - 我想这会转化为严格的"小于(<)"比较,而不是"小于或等于"( <=)" - 对吗?
.net ×2
c# ×2
f# ×2
idiomatic ×2
list ×2
claims ×1
code-reuse ×1
dynamic ×1
exception ×1
federation ×1
java ×1
mercurial ×1
merge ×1
msbuild ×1
msdeploy ×1
performance ×1
porting ×1
reflection ×1
wcf ×1
wif ×1