我正在尝试为Windows服务创建一个安装项目.我已按照http://support.microsoft.com/kb/816169上的说明创建安装项目,没有任何问题.
我希望能够在安装过程中获取一个值,以便使用用户所需的设置更新app.config.我添加了一个Textboxes(A)对话框来检索值.我设置了Edit1Property属性设置为"TIMETORUN",并在我的主输出操作的CustomActionData属性我把以下内容:/ TimeToRun ="[TIMETORUN] \".到现在为止还挺好.运行设置我可以从Context.Parameters集合中检索TimeToRun值而不会出现问题.
为了找到app.config,我还需要将TARGETDIR Windows Installer属性的值传递给我的自定义操作.事情开始分崩离析.为了实现这一点,必须改变上面的CustomActionData:/ TimeToRun ="[TIMETORUN] \"/ TargetDir ="[TARGETDIR] \".现在,当我运行安装程序时,我收到以下错误消息:
错误1001.初始化安装时发生异常.System.IO.FileNotFoundException:无法加载文件或程序集'file:/// C:\ Windows\SysWOW64\Files'或其依赖项之一.该系统找不到指定的文件.
如果谷歌这个问题,你将不可避免地发现通过简单地添加斜线到其巨大成功的人/ TARGETDIR ="[TARGETDIR] \"中的部分CustomActionData.遗憾的是,这并没有解决我的问题.
我尝试了很多不同的CustomActionData字符串变体,但没有一个工作.我试图登录到从我重写文件安装方法来确定破损了,不过没有创建日志文件,因为它甚至没有得到那么远.如错误所示,失败是在初始化步骤期间.
我有一种预感,它可能是安装项目试图加载的依赖项之一.也许某种东西被附加到CustomActionData字符串并且不能很好地与TARGETDIR值(包含空格,即"C:\ Program Files\My Company\Project Name")一起使用.同样,这是另一种预感,由于我无法调试设置过程,我似乎无法确认.
还有一点需要提及,是的,这是另一种预感,这可能是64位版Windows上安装项目的问题吗?我正在运行Windows 7 Professional.
我将提供依赖项的名称,以防它有用:
正如您可能从依赖项中收集的那样,Windows服务正在安排对DTSX包的调用.
对不起,长期咆哮.感谢您的任何帮助,您可以提供.
给定一组特定的权限,例如EditPage,CreateProject,ModifyUser,我目前正在研究创建一些自定义声明类型的两种不同方法来模拟此行为.我可以在网上找到关于最佳方法的小信息,并希望得到一些关于如何在自己的系统中完成此操作的反馈.
我考虑的第一种方法是使用"操作"声明类型,其中特定操作由声明的值指定:
var claims = new []
{
new Claim("http://schemas.company.com/claims/project/action", "EditPage"),
new Claim("http://schemas.company.com/claims/project/action", "CreateProject"),
new Claim("http://schemas.company.com/claims/project/action", "ModifyUser")
}
Run Code Online (Sandbox Code Playgroud)
第二种方法是使用声明类型本身来定义正在执行的操作,不使用该值.这就像"PossessProperty"安全风格,只要用户具有声明类型,他们就可以执行操作.
var claims = new []
{
new Claim("http://schemas.company.com/claims/project/editpage", ""),
new Claim("http://schemas.company.com/claims/project/createproject", ""),
new Claim("http://schemas.company.com/claims/project/modifyuser", "")
}
Run Code Online (Sandbox Code Playgroud)
另请注意,在上面的索赔类型中,我包含了一个"项目"鉴别器,以便我可以区分可以编辑项目A中的页面而不是项目B的用户.
我们还计划将所有这些自定义声明存储在中央"授权"数据库中,因此需要唯一性.
任何想法或反馈将不胜感激.
我刚刚读完了Roy Osherove的"单元测试艺术",我正在努力坚持他在书中列出的最佳实践.其中一个最佳实践是不在测试方法中使用多个断言.这个规则的原因对我来说相当清楚,但它让我怀疑......
如果我有一个像这样的方法:
public Foo MakeFoo(int x, int y, int z)
{
Foo f = new Foo();
f.X = x;
f.Y = y;
f.Z = z;
return f;
}
Run Code Online (Sandbox Code Playgroud)
我是否真的必须编写单独的单元测试以声明Foo的每个单独属性是否使用提供的值进行初始化?在测试方法中使用多个断言真的很少见吗?
仅供参考:我正在使用MSTest.
编辑:感谢所有的回复.我想我最终将继续使用多个断言.在我的情况下,正在测试的行为是MakeFoo制作一个合适的Foo.因此断言每个属性都达到预期值就足够了.但是,如果设置其中一个属性存在条件,那么我将分别测试每个单独的结果.
我仍然不喜欢它....我喜欢每次测试一个断言的想法是你知道测试失败的确切原因.如果您解决了问题,那么测试将通过.有多个断言,您没有相同的保证.如果你修复了失败的断言所提到的问题,那么在测试中的下一次失败就没有什么可以阻止另一个断言了.如果断言被分开,那么你从一开始就知道两个失败.
最后,我不仅仅使用.Equals()的原因是因为在我的情况下,Foo是一个LINQ-To-SQL实体,它引入了一些不值得进入的并发症.
再次感谢.
我喜欢C#中自动实现的属性,但最近有这只大象站在我的小隔间里,我不知道该怎么办.
如果我使用自动实现的属性(以下称"aip"),那么我不再需要内部使用的私有支持字段.这很好,因为aip没有副作用.但是如果稍后我需要在get或set中添加一些额外的处理呢?
现在我需要创建一个支持字段,这样我就可以扩展我的getter和setter.这适用于使用该类的外部代码,因为它们不会注意到差异.但是现在所有对aip的内部引用都会在访问属性时调用这些副作用.现在,必须重构对ate aip的所有内部访问才能使用后备字段.
所以我的问题是,大多数人都做了什么?您是使用自动实现的属性还是更喜欢始终使用后备字段?您如何看待具有副作用的属性?
我刚刚了解了函数声明和函数表达式之间的区别.这让我想知道我是否在AngularJS代码中做得对.我正在遵循John Papa使用的模式,但现在它似乎与模块模式的典型JS方法不一致.John Papa在他的控制器和服务中大量使用嵌套的函数声明.这不好吗?
有没有理由支持这个:
var foo = (function() {
var bar = function() { /* do stuff */ };
return {
bar : bar
};
}());
foo.bar();
Run Code Online (Sandbox Code Playgroud)
对此:
var foo = (function() {
return {
bar : bar
};
function bar() { /* do stuff */ };
}());
foo.bar();
Run Code Online (Sandbox Code Playgroud)
我主要是一名C#开发人员,仍然习惯于JavaScript的所有细微差别.我更喜欢后一种方法,因为IIFE中的所有功能都是私有的,顶部的揭示模块模式实际上是公共部分.在C#类中,我总是在私有支持函数之前拥有我的公共属性和方法.但是,我意识到它在JS世界中可能不那么干脆.
使用后一种方法有哪些隐患(如果有的话)?
javascript module-pattern function-declaration function-expression iife
搜索有关使用超链接和按钮的UI设计模式的输入.
Web应用程序中的屏幕应该/可以混合使用按钮和超链接.似乎"外观"是使用它的主要控制因素,但我想要比这更合乎逻辑的东西.
有谁知道关于何时使用每一个的任何硬性规定?
您是否有自己想要分享的指南?
谢谢.
当为List属性(在C#中)实现setter时,编写它是一件坏事:
private List<string> _TheList = new List<string>();
public List<string> TheList
{
get { return _TheList; }
set { _TheList = value; }
}
Run Code Online (Sandbox Code Playgroud)
它不应该写成:
private List<string> _TheList = new List<string>();
public List<string> TheList
{
get { return _TheList; }
set { _TheList = new List<string>(value); }
}
Run Code Online (Sandbox Code Playgroud)
直到今天我通常使用前者,但我最近发现一些使用后者的代码,似乎这可能是实现它的正确方法.
当对分配给它的外部列表进行更改时,不使用前者会导致更改TheList属性.例如:
List<string> list = new List<string>();
list.Add("Hello");
var c = new someClass();
c.TheList = list;
Run Code Online (Sandbox Code Playgroud)
使用前者不会使用以下代码打破TheList的封装:
list.Clear();
Run Code Online (Sandbox Code Playgroud)
现在c.TheList也是空的,这可能不是我们想要的.但是,使用后一种方法,c .List不会被清除.
我正在尝试使用 OWIN 在新的 Web API 项目上设置 NSwag,但没有成功。我想知道文档是否没有提到某些内容或者我错过了一个步骤。我按照Middlewares Wiki的说明进行操作,但是当我加载默认的 swagger 端点时,我只得到 404。
我需要做些什么来生成应该位于该位置的内容吗?我一直假设中间件可以处理这个问题。
NSwag 是否要求 MVC 成为您项目的一部分?它可以在仅是 Web API 的应用程序中运行吗?
我已经检查了示例项目,但它们都没有将 OWIN 与 ASP.NET Web API 2 一起使用。只有一个 global.asax 示例和一个 .Net Core 示例。
如果您愿意,您可以轻松地重现我的问题。只需使用OWIN Web API 入门模板创建一个新的 ASP.NET Web 应用程序,然后从Middlewares Wiki执行设置即可。(当您创建新项目时, “添加新项目”向导底部附近有一个链接:单击此处上网并查找模板。单击该链接并搜索“OWIN Web API 入门模板”。
如果我需要提供更多详细信息,请告诉我。除了发布一堆代码之外,该入门项目应该允许您在 5-10 分钟内重现我的问题。
谢谢!
我在使用Func在LINQ to SQL查询中使用投影时发现了一些意外行为.示例代码将比单词更好地解释.
使用投影的基本L2S lambda查询:
db.Entities.Select(e => new DTO(e.Value));
Run Code Online (Sandbox Code Playgroud)
它转换为所需的SQL:
SELECT [t1].[Value]
FROM [Entity] AS [t1]
Run Code Online (Sandbox Code Playgroud)
但是,当投影放入Func时,如下所示:
Func<Entity, DTO> ToDTO = (e) => new DTO(e.Value);
Run Code Online (Sandbox Code Playgroud)
并且这样称呼:
db.Entities.Select(e => ToDTO(e));
Run Code Online (Sandbox Code Playgroud)
SQL现在撤回表中的所有列,而不仅仅是投影中的列:
SELECT [t1].[Id], [t1].[Value], [t1].[timestamp], [t1].[etc...]
FROM [Entity] AS [t1]
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,如何在没有LINQ to SQL实例化整个实体的情况下封装这个投影?
要记住的事情,我使用的DTO有一个受保护的默认构造函数,所以我不能使用对象初始化程序.由于无法修改DTO类,我必须创建一个子类来实现该行为.哪个好,如果这是唯一的解决方案.
谢谢.
编辑:
感谢Brian的解决方案.我之前尝试过一个Expression但无法弄清楚语法.这是工作代码:
Expression<Entity, DTO> ToDTO = (e) => new DTO(e.Value);
Run Code Online (Sandbox Code Playgroud)
然后像这样称呼它:
db.Entities.Select(ToDTO);
Run Code Online (Sandbox Code Playgroud)
起初我试图像这样调用它,这不会编译.这是调用Func的正确语法,但不是表达式.
db.Entities.Select(e => ToDTO(e));
Run Code Online (Sandbox Code Playgroud) 使用接口是一种非常简单的方法来删除依赖项,但是当您的某个类需要一个未由接口定义的方法时会发生什么?如果您正在使用构造函数注入或工厂,那么如何在不进行转换的情况下访问该额外方法?这可能吗?
这是一个有这个问题的工厂的例子.我想做一些不可能的事吗?谢谢你的帮助.
interface IFoo {
int X { get; set; }
int Y { get; set; }
}
public class A : IFoo {
int X { get; set; }
int Y { get; set; }
}
public class B : IFoo {
int X { get; set; }
int Y { get; set; }
int Z { get; set; }
}
public static class FooFactory {
public static IFoo GetFoo(string AorB) {
IFoo result = null;
switch (AorB) { …Run Code Online (Sandbox Code Playgroud) 使用 NServiceBus 6 的回调功能,我发现无法提醒客户端请求处理程序失败。请求处理程序将经历所有可恢复性步骤,并最终将消息放入错误队列。同时,客户端只是坐在那里等待它的回复。
// Client code (e.g. in an MVC Controller)
var message = new FooRequest();
var response = await endpoint.Request<FooReponse>(message);
// Handler code
public class FooRequestHandler : IHandleMessages<FooRequest>
{
Task Handle(FooRequest message, IMessageHandlerContext context)
{
throw new Exception("Fails before the reply");
return context.Reply(new FooResponse());
}
}
Run Code Online (Sandbox Code Playgroud)
在上述情况下,如何让 MVC 控制器/调用代码知道处理程序已永久失败?
error-handling callback nservicebus nservicebus6 request-response
c# ×2
assert ×1
callback ×1
claims ×1
factory ×1
iife ×1
interface ×1
javascript ×1
linq-to-sql ×1
list ×1
mstest ×1
nservicebus ×1
nservicebus6 ×1
nswag ×1
owin ×1
permissions ×1
projection ×1
properties ×1
ssis ×1
unit-testing ×1
wif ×1