任何人都可以推荐一些关于如何解决启动UnitTest大型现有CodeBase问题的最佳实践吗?我目前面临的问题包括:
显然,我明白我应该从重构代码开始,使它更少耦合,更可测试.但是,如果没有UnitTests(鸡和鸡蛋,任何人?),进行这样的重构是有风险的.
另外,您是否建议在Domain类或层级类(日志记录,实用程序等)上启动重构和编写测试?
有谁知道一个好的Aspose.Word替代(或类似)产品?你能提一下pro/con使用吗?
我目前正在评估Aspose.Word,虽然它有点像魅力,但它缺少我需要的一些功能.
更新:我们最终编写了自己的DOCX生成器.我们仍然使用Aspose.Word在需要时转换为DOC/HTML.
Jekyll是否支持设置多个永久链接?
例如,我目前在我的内容中有以下内容_config.yml:
permalink: /:categories/:title/
我想拥有的是以下内容:
permalink:
- /:categories/:title/
- /:year/:month/:day/:title/
我正在努力实现它,一个帖子将有多个URL.我很清楚我可以使用"redirect_from"插件(我在GitHub页面中托管),但这需要我手动更新我的所有帖子以包含redirect_from在YAML中
任何人都可以建议一个良好的设计模式来报告/监控长流程的状态/进度.基本上,我有一个接收"数据上下文"对象的代码库:
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 ..."
我考虑过以下几种选择:
INotifyPropertyChanged:向DataContext添加"Progress"属性
public string Progress {get; 设置{_progress = value; RaisePropertyChanged( "进度"); }
并将创建DataContext对象的代码注册到PropertyChanged事件.然而,这似乎是一种过于简单化的方法......
ILog(使用您喜欢的任何日志记录框架):在各种任务/子任务中使用ILog实例,并让主任务执行程序将其自己的侦听器添加到日志记录框架.然而,这似乎是弯曲记录机制来做它本不该做的事情.
Udi Dahan的DomainEvents:任务的执行者可以将DataContext视为"域",因此我们可以尝试为"ProgressChanged"事件实现"EventHandler".从理论上讲,这甚至可以用于更精细的事件,这些事件发生在特定的子任务中......但再一次,感觉就像强迫概念......
我的担忧包括:
我正在开展一个大型项目,我允许用户安排操作.
我一直在使用Quartz.net库,它使用(默认)RAMStore工作正常.但是,随着我的进步,我需要为预定的作业使用更持久的存储.
因为我已经在整个项目中使用RavenDb,所以我希望将它用作Quartz.net的IJobStore实现.然而,实施结果比预期复杂得多:
我也尝试将Quartz.net代码"实习"到我的项目中,但这带来了大量其他问题,对我来说似乎适得其反.
有没有人使用RavenDb为IJobStore提供解决方案/实现?
我正在开发一个Outlook Addin,我必须处理大量的项目.这需要花费很多时间,因此我尝试在不同的线程中运行处理(使用Task.Factory.StartNew).但是,这会导致Outlook随机崩溃.
我正在使用Redemption来处理MAPITable,以减少工作量并仅加载相关数据.
目前,唯一对我有用的是在主线程上运行我的所有逻辑(在按钮单击事件中),但是这会长时间锁定Outlook的用户界面,从用户的角度来看这是不可接受的.
有没有人有一些关于如何使用Outlook Addin中的后台线程的指针?
我们假设您已经创建了一个SharePoint解决方案 - 一个WebPart,一个列表模板的功能,无论如何 - 您计划作为产品销售.
您将如何处理解决方案的许可?
我正在寻找至少以下几个方面的一些意见:
代码明智的:
1.1.你在哪里保留许可证?作为某个地方的文件?(然后在农场发生了什么?)作为农场财产袋中的财产?
1.2.您是否实施了"家庭呼叫" - 您的解决方案会不时地对您公司的服务器验证许可证?
1.3.这个领域的任何其他最佳实践都将受到欢迎......
明智的商业:你如何许可 - 每个用户?每台服务器?每个实例(如果是WebParts或列表模板)?
谢谢.
我正在开发一个WinForm应用程序,它允许使用"项目"(将应用程序视为Visual Studio,将项目视为VS Solutions).
我的问题是 - 应用程序应该在哪里保留其日志文件?
一些要求包括:
我正在考虑在安装应用程序时创建一个"工作文件夹" - 类似于C:\ Application \,然后将日志保存在子文件夹中,例如%WorkingFolder%\ Logs\ProjectName
感谢您的投入.
我在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().
假设我在容器中注册了多个对象,都实现了相同的接口:
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上实现一个Order或Priority属性,只是对任务列表进行排序,但我正在寻找一个更低级别的解决方案.
我有一个带有按钮的文本框(Telerik的RadTextBox配置了Action).当用户按下Action时,会显示进度基础,屏幕变暗,并发生一些魔术.
我的问题是,由于动作不会导致文本框失去焦点,因此屏幕键盘不会被隐藏,并且会一直覆盖屏幕的一半.
我想以编程方式隐藏屏幕键盘,但不知道如何.
我正在尝试使用MSBuild和TFS.
我已经设法创建了自己的MSBuild脚本,它在命令行中运行良好.该脚本适用于csproj文件,并编译,混淆,签名和复制所需的所有内容.
但是,查看TFS和Team Build的文档,它似乎希望解决方案成为脚本的"输入".
此外,我还没有找到一种简单/直观的方法来从TFS执行"获取最新版本"作为脚本的一部分.我假设Team Build会自动对它想要编译的解决方案做一个"获取最新",但是再次 - 我不(想要)使用解决方案......
任何见解?任何指针?任何链接?
有谁知道在哪里可以找到各种主题的大量样本文件库?我正在寻找至少几千个文件(办公室或PDF应该没问题)以便测试一些算法......文件应该有一些共同点 - 例如,一千个与编程有关的文档,另外一千个与编程相关的文档生态学等...
谁知道我能在哪里得到它?
c# ×4
ravendb ×2
github-pages ×1
jekyll ×1
licensing ×1
logging ×1
ms-word ×1
msbuild ×1
nservicebus ×1
outlook ×1
permalinks ×1
progress ×1
quartz.net ×1
refactoring ×1
reporting ×1
sample ×1
sharepoint ×1
tfs ×1
unit-testing ×1
vsto ×1
web-parts ×1
windows ×1
winforms ×1