是否有任何已建立的命名或编码约定用于在C#中定义命名空间或类型别名?
对于那些不知道的人,C#语言有一个功能,可以在名称空间和类型的文件本地定义别名.当与第三方库存在命名冲突以及缩短代码中的类型名称时,这可能很有用.下面是它的样子的一个例子.
using Forms = System.Windows.Forms;
Run Code Online (Sandbox Code Playgroud)
我在网上看到的大多数示例都倾向于使用未缩写的大写名称作为别名,例如上面示例中的别名Forms.在某些地方,包括官方MSDN页面,该页面解释了命名空间System.Collections的colAlias别名的示例.为了使其更复杂,根据是否定义了命名空间别名或类型别名,可能会优先选择一些指南.
为了给出一些背景,说明为什么我对别名的指南感兴趣,我会解释我在做什么.在最近的一个项目中,我开始简化一个模式,其中我有几个继承自通用基类的类,它通过使用类型别名接受复杂类型参数.
因此,使用此技术,下面的复杂示例将变得更加可读,一旦应用了类型别名.
public class MyClass: MyGenericBaseClass<TripleLindyFancyAlgorithm<List<SomeValueType>>, List<SomeValueType>>
{
public override List<SomeValueType> DoSomething(TripleLindyFancyAlgorithm<List<SomeValueType>> operation)
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
并且在使用类型别名的must clean版本下面.
using Result = List<SomeValueType>;
using Algorithm = TripleLindyFancyAlgorithm<List<SomeValueType>>; // Note: cannot reference an alias within an alias definition!
public class MyClass: MyGenericBaseClass<Algorithm, Result>
{
public override Result DoSomething(Algorithm operation)
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
虽然这看起来更简单,但很容易忘记像Result这样的别名实际上只是List的别名,并且没有名为Result的实际类型.为了在视觉上分离概念,我正在考虑遵循一些前缀约定,类似于在私有成员之前使用下划线'_',以帮助区分类型别名和实际类型.在我这样做之前,我想确保我没有重新发明轮子,因为可能已经有更多已建立的惯例.
我有两个库和一个应用程序集程序项目布局,我想知道如何通过其中一个我在另一个库中定义的库中的键来引用样式.
我的解决方案布局
我已经看到一些示例解释如何使用简单的单个控件库和应用程序组件来执行此操作,但在我的情况下,我有两个程序集和一个应用程序.所以换句话说在我的情况下,我的第二个控件库中没有App.xaml,我可以使用MergeDictionaries概念.我很确定我是否可以直接在每个控件XAML文件中放置一个MergedDictionaries引用来合并WpfControls.dll程序集中定义的所有Generic.xaml但我的猜测是这会导致样式被冗余地合并到各个地方在我的SpecializedControls程序集中,这似乎不是最好的解决方案.更糟糕的是,这些词典也可能合并到Application.exe中,这会在运行时开始膨胀我的应用程序吗?
任何人都可以用最少的编程和资源开销来澄清分享这些样式的推荐或最佳方法.
更新:经过一些测试后,即使在同一个程序集中,我也无法通过它的密钥引用Generic.xaml中定义的任何资源.关于我如何理解资源键的工作方式可能存在一些完全错误,所以我需要进行更多的研究以及调查ComponentResourceKey.如果有人有任何提示或建议,请帮助.
我有兴趣弄清楚如何从Visual FoxPro自动化构建,类似于我们如何使用MSBuild从命令行构建.NET项目.
似乎可以将命令行参数传递给VFP.exe,其中可能包括指定运行的一些初始启动prg的能力,但是不清楚启动IDE将如何从非交互式帐户(如网络服务)起作用在Windows上,这可能是自动构建运行的地方.
有没有人试过这个或者读过任何试图编写像这样的VFP版本的人?我会很感激任何可能导致我找到解决方案的指针.
我在MVVM的上下文中讨论了一些不同的设计概念,主要源于何时初始化ViewModel的问题.在"初始化"方面更具体,我指的是加载值,例如选择值,安全上下文以及在某些情况下可能导致几秒延迟的其他事情.
可能的策略:
影响ViewModel属性的getter和setter
在初始化被推迟的情况下有必要知道视图模型是否为其IsBusy财产通常作用就像它对于其他异步和耗时的操作被认为是可用的状态.这也意味着,因为ViewModel上的大多数属性都暴露从模型对象中检索的值,我们不得不编写以下类型的管道以确保模型可用.
public string Name
{
get
{
if (_customerModel == null) // Check model availability
{
return string.Empty;
}
_customerModel.Name;
}
}
Run Code Online (Sandbox Code Playgroud)
尽管检查很简单,但它只是增加了INPC的管道和其他类型的必需品,使ViewModel的编写和维护变得有些麻烦.在某些情况下,它变得更加成问题,因为可能并不总是有一个合理的默认值从属性getter返回,这可能是布尔属性IsCommercialAccount的情况,如果没有可用的模型,返回true或者返回true是没有意义的错误地引起了一系列其他设计问题的质疑,例如可空性.在上面的选项1的情况下,我们将所有内容传递给构造函数并加载它,然后我们只需要关注View中的NULL ViewModel,并且当ViewModel不为null时,保证初始化.
支持延迟初始化
使用选项4,还可以依赖于可以在ViewModel的基类中实现的ISupportInitialize,以提供一致的方式来发信号通知ViewModel是否已初始化,并且还通过标准方法BeginInit启动初始化.这也可以在选项2和3的情况下使用,但如果所有初始化参数都在一个原子事务中设置,则没有意义.至少以这种方式,上面显示的条件可能变成类似的东西
设计如何影响IoC
就IoC而言,我理解选项1和3可以使用通常优选的构造函数注入来完成,并且选项2和4可以分别使用方法和属性注入来完成.然而,我关注的不是IoC或如何传递这些参数,而是整体设计以及它如何影响ViewModel实现及其公共接口,尽管我希望成为一个好公民,如果有必要,可以使IoC更容易未来.
可测性
这三个选项似乎支持可测性同样的概念,没有太大的帮助在这些选项之间做出决定,虽然这是值得商榷的选项4可能需要一个更广泛的测试,以确保性能的正常行为如该行为依赖于初始化状态.
指挥能力
选项2,3和4都有副作用,要求View中的代码隐藏在ViewModel上调用初始化方法,但是如果需要,这些可以作为命令公开.在大多数情况下,可能会在构造之后直接加载调用这些方法,如下所示.
var viewModel = new MyViewModel();
this.DataContext = viewModel;
// Wrap in an async call if necessary
Task.Factory.StartNew(() => viewModel.InitializeWithAccountNumber(accountNumber));
Run Code Online (Sandbox Code Playgroud)
其他一些想法
我已经尝试过这些策略的变体,因为我一直在使用MVVM设计模式,但尚未就最佳实践做出总结.我很想听听社区的想法,并尝试就初始化ViewModel或在其处于不可用状态时处理其属性的最佳方式找到合理的共识.
理想情况可能是使用状态模式,其中ViewModel本身与表示不同状态的不同ViewModel对象交换.因此,我们可以有一个通用的BusyViewModel实现,它表示忙状态,它消除了ViewModel上IsBusy属性的一个需求,然后当下一个ViewModel准备就绪时,它在View上被换出,允许ViewModel遵循概述的状态在选项1中,它在施工期间完全初始化.这留下了一些关于谁负责管理状态转换的问题,例如,BusyViewModel可以负责抽象类似于BackgroundWorker或正在进行初始化的Task,并在准备好时呈现内部ViewModel.关于另一方面视图交换DataContext的可能需要或者处理在搜索的事件或给人以查看到BusyViewModel所以它可以在传统的状态模式的意义上被设置的DataContext属性的有限访问.如果人们在这些方面做了类似的事情,我肯定想知道,因为我的谷歌搜索还没有发现.
我一直认为在服务器上使用NodeJS的一大好处是可能在服务器端和客户端之间共享代码(例如输入验证).现在我实际上正在使用NodeJS进行开发,我发现的一个难点是确定执行每个代码体的责任和上下文.下面我将列出一些我曾经遇到过的困难,希望能够对我可能忽略的惯例或指导有所启发,这有助于提升这些问题.
构建时间代码
以遵循基本文档的方式构建使用Gulp,Grunt或vanilla NPM的项目的时间代码通常很容易理解.大多数较小的项目倾向于将所有代码保存在单个文件中,并且文件往往被命名为传统名称,如gulpfile.js,但是对于更大的项目,我看到这些脚本开始被拆分.我已经看到一些gulp文件被拆分成多个文件并放在一个单独的目录下的情况.更糟糕的是,我发现gulpfile.js文件甚至没有这样命名的情况导致新开发人员寻找gulpfile所在的位置,一旦找到它,gulp命令总是必须运行特定的- -gulpfile选项.
运行时服务器端代码
基本节点应用程序的入口点似乎只需要在运行node命令时指出特定的JavaScript文件(例如node script.js).对于Web服务器应用程序,例如那些使用Express的应用程序,我注意到按照惯例,入口点文件通常称为server.js,通常可以在应用程序的根目录中找到.在某些其他情况下,例如在开发人员环境中运行Web服务器时,我看到gulp任务负责启动Node.在这些情况下,似乎有多种方法可以包含入口点,但我发现的一个例子就是启动webpack编译器,然后是入口点脚本的require语句.在这种类型的设置中,弄清楚如何结合关于如何完成典型节点调试命令的正常指导是非常重要的.除了应用程序的入口点之外,似乎没有关于NodeJS/Express应用程序的目录结构的任何一般指导,这些应用程序将服务器端特定代码保存在其中以帮助定位它并使其与构建时间和客户端代码.
服务器端代码既用于提供静态内容,服务器端生成的视图(例如使用MVC),也用于向客户端提供API,服务器端故事变得更加复杂.侧.我倾向于将API与应用程序项目分开,但我从其他人那里得到的感觉是,这样做有一种过于复杂的感觉,我将其视为合理的关注点分离.
运行时客户端代码
由于客户端代码通常可以根据请求的第一页具有各种入口点,因此这可能很棘手.但是,由于URL的一般透明性以及它们如何映射到典型情况下的资源,以及调试工具在现代浏览器中的强大程度,因此遵循脚本并不会太麻烦.对于典型的构建过程而言,难以替代客户端代码,这通常最终会复制文件并将它们放置在不同名称下的生产类结构中.一个例子是一个项目,它有一个名为src或js的文件夹,它保存客户端和服务器端代码混合,除了只有一部分文件碰巧包含在构建任务中,该任务转换并经常连接文件和将它们放在分发文件夹中.我见过的这些分发文件夹的常用名称是dist,public,www和wwwroot.通常,如果不总是这些目录位于项目的根目录,这至少使得它更容易定位而无需询问构建脚本.
我希望有一些一般指导如何将所有这些结合在一起,或许是一个权威的来源,主要是为那些像我一样可能想要从右脚开始的人提供指导.作为副作用或许能够引用某种标准,即使它是一个松散的标准,也可能减少团队在开始时发明和讨论的样板数量.在上面列出的每个上下文中,显然会有一些技术特定的约定,例如客户端的AngularJS,Meteor或ReactJS遵循的约定.我正在寻找的约定更具体地分离端到端JavaScript应用程序中的主要高级上下文,其中语言和平台不再是区分每种语言和平台的明显方式.
在整个Windows用户体验指南中,建议在应用程序中使用适当的SystemColors,以确保应用程序的默认主题与系统的其余部分保持一致.我完全同意; 唯一的问题是,似乎没有指导SystemColors类型中的命名值如何映射到典型用户界面的实际公共部分.相反,我们会给出像Caption这样的名称,并希望了解适用的控件.
开发人员是否可以在任何地方找到一套体面的可视指南,以了解SystemColors中的值如何映射到通用用户界面?
作为我正在寻找的一个例子,在Windows UX指南中,在用户界面文本部分下有一个主要指令的概念,在最近的默认Windows主题中通常看起来像深蓝色.SystemColor是什么让我自己的"主要指令"标签使用相同的颜色?
I have done a little bit of research on this and looked through a few articles both here on StackOverflow as well as some blog posts, but haven't found an exact answer. I also read that it is possible to do it using the 4.0 framework, but have yet to find any supporting evidence.
So my question, is it possible to perform SOUNDEX via a LINQ to SQL Query?
有没有人知道在哪里可以找到Udi Dahan在Domain Events - Salvation中描述的域事件实现的示例代码?
我很好奇WebComponents的工作是否有可能在不违反规则的情况下逃脱嵌套HTML表单之类的事情.我问,因为我很好奇WebComponent的内部与包含它们的祖先元素有多孤立.我可以想象,如果使用WebComponents无法嵌套表单,那么由于消费者不了解组件内部的问题,可能会导致建议转向组件远离包含表单.
无论哪种方式,我都进行了一些挖掘并且无法进行任何操作,所以我想我会在这里咨询专家以获得更多见解.
相关文章:
在查看其他开发人员在使用Redux时处理输入焦点的方式时,我遇到了一些针对ReactJS组件的一般指导.然而,我担心的是focus()函数是必不可少的,我可以看到多个组件争夺焦点的奇怪行为.是否有一种处理焦点的redux方式?是否有人使用redux处理实用设置焦点并做出反应,如果有,你使用什么技术?
有关:
c# ×2
.net ×1
alias ×1
assemblies ×1
build ×1
build-time ×1
coding-style ×1
command-line ×1
constructor ×1
events ×1
flux ×1
focus ×1
forms ×1
foxpro ×1
html5 ×1
javascript ×1
linq-to-sql ×1
mvvm ×1
namespaces ×1
node.js ×1
organization ×1
reactjs ×1
redux ×1
runtime ×1
soundex ×1
sql ×1
styles ×1
systemcolors ×1
themes ×1
viewmodel ×1
wpf ×1