小编Sag*_*tay的帖子

在LARGE项目上启动UnitTesting

任何人都可以推荐一些关于如何解决启动UnitTest大型现有CodeBase问题的最佳实践吗?我目前面临的问题包括:

  • 巨大的代码库
  • ZERO现有的UnitTests
  • 类之间的高耦合
  • 复杂的OM(我在这里做的不多 - 这是一个复杂的业务领域)
  • 缺乏编写UnitTests/TDD的经验
  • 数据库依赖
  • 外部源依赖项(Web服务,WCF服务,NetBIOS等)

显然,我明白我应该从重构代码开始,使它更少耦合,更可测试.但是,如果没有UnitTests(鸡和鸡蛋,任何人?),进行这样的重构是有风险的.

另外,您是否建议在Domain类或层级类(日志记录,实用程序等)上启动重构和编写测试?

refactoring unit-testing

19
推荐指数
3
解决办法
2530
查看次数

Aspose.Word替代品

有谁知道一个好的Aspose.Word替代(或类似)产品?你能提一下pro/con使用吗?

我目前正在评估Aspose.Word,虽然它有点像魅力,但它缺少我需要的一些功能.

更新:我们最终编写了自己的DOCX生成器.我们仍然使用Aspose.Word在需要时转换为DOC/HTML.

ms-word

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

Jekyll多个永久链接支持

Jekyll是否支持设置多个永久链接?

例如,我目前在我的内容中有以下内容_config.yml:

permalink: /:categories/:title/

我想拥有的是以下内容:

permalink: - /:categories/:title/ - /:year/:month/:day/:title/

我正在努力实现它,一个帖子将有多个URL.我很清楚我可以使用"redirect_from"插件(我在GitHub页面中托管),但这需要我手动更新我的所有帖子以包含redirect_from在YAML中

permalinks jekyll github-pages

11
推荐指数
1
解决办法
1358
查看次数

用于报告/监控长流程进度的设计模式

任何人都可以建议一个良好的设计模式来报告/监控长流程的状态/进度.基本上,我有一个接收"数据上下文"对象的代码库:

public class DataContext : IDataContext
{
    pulbic Dictionary<string, objects> Properties { get; private set; }

    // Additional properties removed for simplicity...
}
Run Code Online (Sandbox Code Playgroud)

基于提供的上下文,创建具有各种子任务的任务(不是TPL-Task)对象.在执行期间,DataContext对象将传递给各种子任务,这些子任务可以检索或更新它.

例如,假设主要任务是"复制文件"任务.DataContext将具有SourceFolder和TargetFolder等属性,并且可能具有FilterFiles属性(例如*.docx).我们的主要任务是CopyFilesTasks,它将有一个子流的"管道" - 扫描文件夹,扫描文件,过滤文件,复制文件等....

我正在寻找的是允许任务/子任务向调用者/执行者报告其进度的最佳方法.在上面的示例中,进度中的更改可能只是"复制文件ABC.docx ...",或者可能更"复杂",例如"扫描文件夹XYZ ..."

我考虑过以下几种选择:

  1. INotifyPropertyChanged:向DataContext添加"Progress"属性

    public string Progress {get; 设置{_progress = value; RaisePropertyChanged( "进度"); }

    并将创建DataContext对象的代码注册到PropertyChanged事件.然而,这似乎是一种过于简单化的方法......

  2. ILog(使用您喜欢的任何日志记录框架):在各种任务/子任务中使用ILog实例,并让主任务执行程序将其自己的侦听器添加到日志记录框架.然而,这似乎是弯曲记录机制来做它本不该做的事情.

  3. Udi Dahan的DomainEvents:任务的执行者可以将DataContext视为"域",因此我们可以尝试为"ProgressChanged"事件实现"EventHandler".从理论上讲,这甚至可以用于更精细的事件,这些事件发生在特定的子任务中......但再一次,感觉就像强迫概念......

我的担忧包括:

  • 进度可能不是唯一需要监控的"事件" - 在上面的示例中,我们可能需要更多定义的内容,如FolderHandled,FileCopied等,但我们可能不知道执行任务时的确切事件(请记住 - 子任务是基于DataContext创建的,可能导致执行不同的任务).
  • 尚未定义运行任务的上下文.目前,我只是计划从命令行应用程序运行任务,因此需要输出到命令行进行调试.稍后,当我将其移动到服务时,我可能希望让"监听器"更新具有任务进度的数据库(例如).

c# reporting design-patterns progress

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

使用RavenDb的Quartz.Net JobStore

我正在开展一个大型项目,我允许用户安排操作.

我一直在使用Quartz.net库,它使用(默认)RAMStore工作正常.但是,随着我的进步,我需要为预定的作业使用更持久的存储.

因为我已经在整个项目中使用RavenDb,所以我希望将它用作Quartz.net的IJobStore实现.然而,实施结果比预期复杂得多:

  • 各种Key不容易为RavenDb序列化以保存/加载它们
  • IJobStore实现预计不仅仅是对作业和触发器的CRUD操作 - 它似乎包含一些"真正的"业务逻辑

我也尝试将Quartz.net代码"实习"到我的项目中,但这带来了大量其他问题,对我来说似乎适得其反.

有没有人使用RavenDb为IJobStore提供解决方案/实现?

c# quartz.net ravendb

6
推荐指数
0
解决办法
515
查看次数

Outlook Addin:使用线程

我正在开发一个Outlook Addin,我必须处理大量的项目.这需要花费很多时间,因此我尝试在不同的线程中运行处理(使用Task.Factory.StartNew).但是,这会导致Outlook随机崩溃.

我正在使用Redemption来处理MAPITable,以减少工作量并仅加载相关数据.

  • 我已经尝试从我的主线程和我的工作线程初始化我的RDOSession.
  • 我试过在主线程上获取MAPIFolders,并且只在工作线程上使用MAPITable

目前,唯一对我有用的是在主线程上运行我的所有逻辑(在按钮单击事件中),但是这会长时间锁定Outlook的用户界面,从用户的角度来看这是不可接受的.

有没有人有一些关于如何使用Outlook Addin中的后台线程的指针?

outlook vsto outlook-addin outlook-redemption

6
推荐指数
1
解决办法
1818
查看次数

如何许可sharepoint解决方案?

我们假设您已经创建了一个SharePoint解决方案 - 一个WebPart,一个列表模板的功能,无论如何 - 您计划作为产品销售.

您将如何处理解决方案的许可?

我正在寻找至少以下几个方面的一些意见:

  1. 代码明智的:

    1.1.你在哪里保留许可证?作为某个地方的文件?(然后在农场发生了什么?)作为农场财产袋中的财产?

    1.2.您是否实施了"家庭呼叫" - 您的解决方案会不时地对您公司的服务器验证许可证?

    1.3.这个领域的任何其他最佳实践都将受到欢迎......

  2. 明智的商业:你如何许可 - 每个用户?每台服务器?每个实例(如果是WebParts或列表模板)?

谢谢.

sharepoint licensing web-parts

5
推荐指数
1
解决办法
1795
查看次数

WinForm应用程序应该在哪里保留其日志?

我正在开发一个WinForm应用程序,它允许使用"项目"(将应用程序视为Visual Studio,将项目视为VS Solutions).

我的问题是 - 应用程序应该在哪里保留其日志文件?

一些要求包括:

  • 该应用程序可能无法以管理员身份运行(这样在节省的%ProgramFiles%的安装文件夹是不是一个好的选择)
  • 最终用户可以访问日志(用于审阅或发送给支持团队).(这意味着很难找到的文件夹,比如%APPDATA%\公司\应用\版本\项目名......是不是一个好的解决方案)
  • 即使没有打开项目,应用程序也可能生成日志(因此,只有在有项目时才保存项目文件夹中的日志,但不是最终解决方案).

我正在考虑在安装应用程序时创建一个"工作文件夹" - 类似于C:\ Application \,然后将日志保存在子文件夹中,例如%WorkingFolder%\ Logs\ProjectName

感谢您的投入.

windows logging desktop-application winforms

5
推荐指数
1
解决办法
909
查看次数

在NServiceBus下管理Windsor中的RavenDb会话

我在MVC 4项目中使用NServiceBus(3.2.2),RavenDB(1.2.2017-Unstable)和Windsor(3.0.0.4001).

我有一个处理3个不同消息的IHandleMessages类,它需要一个IDocumentSession,因此定义了一个属性,例如:

public IDocumentSession DocumentSession { get; set; }
Run Code Online (Sandbox Code Playgroud)

我从NServiceBus的网站上复制了RavenDbUnitOfWork实现

我在我的Windsor容器中注册了IDocumentStore,IDocumentSession和IManageUnitsOfWork,如下所示:

container.Register(
            Component
                .For<IManageUnitsOfWork>()
                .ImplementedBy<RavenUnitOfWork>()
                .LifestyleTransient()
            );
container.Register(
            Component
                .For<IDocumentStore>()
                .UsingFactoryMethod(k => DocumentStoreHolder.DocumentStore)
                .LifestyleSingleton(),
            Component
                .For<IDocumentSession>()
                .UsingFactoryMethod(k => k.Resolve<IDocumentStore>().OpenSession())
                .LifestyleTransient()
            );
Run Code Online (Sandbox Code Playgroud)

NServiceBus配置为使用我的容器:

Configure.With()
         .CastleWindsorBuilder(container);
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是UnitOfWork和消息处理程序接收到DocumentSession的不同实例.这意味着不会保存存储在消息处理程序中的会话中的对象,因为在另一个DocumentSession上调用了SaveChanges().

删除Transient生活方式会导致不同类型的问题,从RavenDb更新对象时会导致并发/冲突,因为(可能)消息处理程序不断获取DocumentSession的相同实例,该实例包含更新对象的缓存版本.

更新:

正如所建议的那样,我已经尝试将Windsor中IDocumentSession的注册更改为Scope生活方式,如下所示:

Component
    .For<IDocumentSession>()
    .UsingFactoryMethod(k => k.Resolve<IDocumentStore>().OpenSession())
    .LifestyleScope()
Run Code Online (Sandbox Code Playgroud)

当容器尝试解析MVC控制器时,这会导致异常,说未找到范围,并询问我是否忘记调用BeginScope().

castle-windsor nservicebus ravendb

5
推荐指数
1
解决办法
806
查看次数

在温莎城堡致电ResolveAll时订购

假设我在容器中注册了多个对象,都实现了相同的接口:

container.Register(
    Component.For<ITask>().ImplementedBy<Task1>(),
    Component.For<ITask>().ImplementedBy<Task2>(),
    Component.For<ITask>().ImplementedBy<Task3>(),
    Component.For<ITask>().ImplementedBy<Task4>(),
);
Run Code Online (Sandbox Code Playgroud)

我希望解决ITask的所有实现:

var tasks = container.ResolveAll<ITask>();
Run Code Online (Sandbox Code Playgroud)

有没有办法控制已解析实例的顺序?

注意:显然,我可以在ITask上实现一个OrderPriority属性,只是对任务列表进行排序,但我正在寻找一个更低级别的解决方案.

c# castle-windsor dependency-resolver

5
推荐指数
1
解决办法
1206
查看次数

如何以编程方式隐藏键盘

我有一个带有按钮的文本框(Telerik的RadTextBox配置了Action).当用户按下Action时,会显示进度基础,屏幕变暗,并发生一些魔术.

我的问题是,由于动作不会导致文本框失去焦点,因此屏幕键盘不会被隐藏,并且会一直覆盖屏幕的一半.

我想以编程方式隐藏屏幕键盘,但不知道如何.

c# windows-phone

3
推荐指数
1
解决办法
3344
查看次数

使用MSBuild和TFS

我正在尝试使用MSBuild和TFS.

我已经设法创建了自己的MSBuild脚本,它在命令行中运行良好.该脚本适用于csproj文件,并编译,混淆,签名和复制所需的所有内容.

但是,查看TFS和Team Build的文档,它似乎希望解决方案成为脚本的"输入".

此外,我还没有找到一种简单/直观的方法来从TFS执行"获取最新版本"作为脚本的一部分.我假设Team Build会自动对它想要编译的解决方案做一个"获取最新",但是再次 - 我不(想要)使用解决方案......

任何见解?任何指针?任何链接?

msbuild tfs

2
推荐指数
1
解决办法
5735
查看次数

大量的样本文件

有谁知道在哪里可以找到各种主题的大量样本文件库?我正在寻找至少几千个文件(办公室或PDF应该没问题)以便测试一些算法......文件应该有一些共同点 - 例如,一千个与编程有关的文档,另外一千个与编程相关的文档生态学等...

谁知道我能在哪里得到它?

sample

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