我是设计模式的新手,但我在去年一直在努力实施.我从一个新组织开始,所有代码都包含在表单中.自从我来到这里以来,我一直在尝试为我们的.NET 2.0应用程序使用MVC方法.
其他开发人员已经开始看到这种方法的必要性,我们正在达到一个我们希望就我们都将遵循的设计模式达成一致的程度.虽然我一直在努力学习,但我不确定哪种模式最适合实施.以下是我们的一些设计约束:
如果您有其他问题,请与我们联系.我感谢您的帮助.
谢谢!
参考此CodePlex统一文章,我能够使用WebAPI控制器获取过滤器属性,如下所示:
[MyFilterAttribute]
public class TestController : ApiController
{}
Run Code Online (Sandbox Code Playgroud)
但是,如果我想在使用GlobalConfiguration的所有操作中应用我的filter属性,它将被剥离注入的依赖项:
public class MyFilterAttribute : ActionFilterAttribute
{
[Dependency]
public MyDependency { get; set; }
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (this.MyDependency == null) //ALWAYS NULL ON GLOBAL CONFIGURATIONS
throw new Exception();
}
}
public static class UnityWebApiActivator
{
public static void Start()
{
var resolver = new UnityDependencyResolver(UnityConfig.GetConfiguredContainer());
GlobalConfiguration.Configuration.DependencyResolver = resolver;
GlobalConfiguration.Configuration.Filters.Add(new MyFilterAttribute());
RegisterFilterProviders();
}
private static void RegisterFilterProviders()
{
var providers =
GlobalConfiguration.Configuration.Services.GetFilterProviders().ToList();
GlobalConfiguration.Configuration.Services.Add(
typeof(System.Web.Http.Filters.IFilterProvider),
new UnityActionFilterProvider(UnityConfig.GetConfiguredContainer()));
var …Run Code Online (Sandbox Code Playgroud) 我最近一直在阅读Code Complete,基于这里和朋友的许多参考资料,并为社区提出了一个命名问题.是否应该在确定事件是否成功的布尔方法上使用前缀"Is"?这是我尝试的两种不同命名方案的代码示例:
migrationSuccessful = CopyData();
if (VerifyCopyData())
migrationSuccessful = CleanupData();
Run Code Online (Sandbox Code Playgroud)
与:
migrationSuccessful = CopyData();
if (IsDataCopied())
migrationSuccessful = CleanupData();
Run Code Online (Sandbox Code Playgroud)
注意VerifyCopyData和IsDataCopied之间的区别.对我来说,IsDataCopied更有意义,并使代码以更具描述性的模式流动.
谢谢你的想法!
编辑:基于一些评论,我想我会澄清IsDataCopied方法的作用.它遍历多个目录和文件,并确保源和目标目录/文件匹配.
我编写了以下方法来确定最大文件大小:
public static long GetMaxFileSize(string dirPath, long maxFileSize)
{
DirectoryInfo [] dirInfos = new DirectoryInfo(dirPath).GetDirectories();
foreach (DirectoryInfo dirInfo in dirInfos)
{
DirectoryInfo [] subDirInfos = dirInfo.GetDirectories();
foreach (DirectoryInfo subDirInfo in subDirInfos)
maxFileSize = GetMaxFileSize(dirInfo.FullName, maxFileSize);
FileInfo [] fileInfos = dirInfo.GetFiles();
foreach (FileInfo fileInfo in fileInfos)
{
if (maxFileSize < fileInfo.Length)
maxFileSize = fileInfo.Length;
}
}
return maxFileSize;
}
Run Code Online (Sandbox Code Playgroud)
代码完成建议"有选择地使用递归".既然如此,我想知道社区是否认为这是递归的有效用法.如果没有,是否有更好的技巧?
编辑:我不能使用LINQ,因为它在.NET 2.0中不可用,但我不想将其标记为.NET 2.0问题,只是为了进一步讨论点,如下面的Jared.
编辑: 根据未获取根目录文件时发现的问题清理代码.
public static long GetMaxFileSize(DirectoryInfo dirInfo, long maxFileSize)
{
DirectoryInfo [] subDirInfos = dirInfo.GetDirectories();
foreach …Run Code Online (Sandbox Code Playgroud) 我正在寻找代码签署我们公司的应用程序的选项,似乎有几个不同的提供商,如:
每个供应商是否有利弊,或者它们基本相同,我应该使用价格最便宜的那个?我的最终目标是将我的应用程序称为可信提供商,以便我们可以在没有UAC提示的情况下进行独立的用户更新.
注意:我知道StackOverflow上已有关于代码签名选项的问题,但我相信这个问题有点不同.
编辑:扩展的选项列表,如下面的评论中所述.
你能在实体框架中为实体添加"或"条件吗?例如:
Property1 ==(1或2或3)
将值设置为"1 || 2 || 3"或"1,2,3"或"1或2或3"时收到的消息将返回以下消息:
Run Code Online (Sandbox Code Playgroud)condition is not compatible with the type of the member
我需要在Access数据库上执行压缩和修复操作.为此,需要关闭与数据库的所有打开连接.不幸的是,有一些开放的连接,我不能总是正确地追踪和关闭.有没有办法通过代码断开所有打开的连接?
我有一个对象可以从一瞬间到几分钟进行初始化.原因是构造函数从Web服务检索数据,可能是几千字节到几兆字节,并且根据用户的连接速度,性能可能会有很大差异.出于这个原因,我想把事件放在那将处理进度通知.
这是我的问题:我可以在构造函数中放置事件处理程序,还是应该使用Load方法执行此类操作?
例如:
public class MyObject
{
public event EventHandler<UpdateLoadProgressEventArgs> UpdateLoadProgress;
public MyObject(int id)
{
Background worker bgWorker = new BackgroundWorker();
bgWorker.DoWork += delegate(object s, DoWorkEventArgs args)
{
//load data and update progress incrementally
UpdateLoadProgress(this, new UpadteLoadProgressEventArgs(progressValue));
Result = someValue;
}
bgWorker.RunWorkAsync();
}
public int Result
{
get;
set;
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试将事件处理程序绑定到构造函数时,它们在被调用时始终为null:
MyObject o = new MyObject(1);
o.UpdateLoadProgress += new EventHandler<EventArgs>(o_UpdateLoadProgress);
Run Code Online (Sandbox Code Playgroud)
我认为这是因为我在构造函数之后连接了事件.我看到的唯一选择是创建一个Load方法来完成构造函数的工作.缺点是任何使用此类的人必须知道在尝试访问Result(或任何其他属性)之前调用Load.
编辑: 这是最终的解决方案:
MyObjectBuilder类
public class MyObjectBuilder
{
public event ProgressChangedEventHandler ProgressChanged;
public MyObject CreateMyObject()
{
MyObject o = …Run Code Online (Sandbox Code Playgroud) 我对以下情况感到困惑.假设我有一个带行的表.当用户单击表中的按钮时,我希望用户表单向下滑动jQuery并显示包含所选行值的表单.以下是我目前正在做的事情,这没有多大意义:
视图
<tr ng-click="setItemToEdit(item)" slide-down-form>
Run Code Online (Sandbox Code Playgroud)
...
<form>
<input type="test" ng-model={{itemToEdit.Property1}} >
<button ng-click=saveEditedItem(item)" slide-up-form>
<form>
Run Code Online (Sandbox Code Playgroud)
控制
$scope.itemToEdit = {};
$scope.setItemToEdit = function(item) {
$scope.itemToEdit = item;
});
$scope.saveEditedItem = function(item) {
myService.add(item);
$scope.itemToEdit = {};
}
Run Code Online (Sandbox Code Playgroud)
指令 - 上滑/下滑
var linker = function(scope, element, attrs) {
$(form).slideUp(); //or slide down
}
Run Code Online (Sandbox Code Playgroud)
似乎我的指令和我的控制逻辑太过断开了.例如,如果存在保存错误会发生什么?表单已隐藏,因为slideUp事件已完成.在这种情况下,我很可能想要阻止slideUp操作.
我只使用AngularJS大约一个星期,所以我确信有些东西我不见了.
我想对正在构建的自定义Powershell Commandlet使用SqlServerCmdletSnapin。如果将以下代码添加到PSM1的开头:
if ( (Get-PSSnapin -Name sqlserverprovidersnapin100 -ErrorAction SilentlyContinue) -eq $null )
{
Add-PsSnapin sqlserverprovidersnapin100
}
if ( (Get-PSSnapin -Name sqlservercmdletsnapin100 -ErrorAction SilentlyContinue) -eq $null )
{
Add-PsSnapin sqlservercmdletsnapin100
}
Export-ModuleMember Invoke-SqlCmd
Run Code Online (Sandbox Code Playgroud)
第一次运行时一切正常:
导入模块MyModule-强制
但是,我第二次运行:
导入模块MyModule-强制
我收到以下错误:
Add-PsSnapin:已经添加了具有相同密钥的项目。
而且我的代码无法再调用Invoke-SqlCmd。将Powershell管理单元添加到自定义模块的最佳方法是什么?
.net ×3
c# ×3
angularjs ×1
architecture ×1
cmdlets ×1
code-signing ×1
ms-access ×1
powershell ×1
pssnapin ×1