我正在设计一个产品管理系统.我想知道在我的应用程序中处理每个Action/View中的大量变化的最佳方法.该应用程序处理20个类别和12个目标市场,每个类别都会影响每个产品需要收集的数据.例如,"QuickAdd"操作接收核心数据,如产品名称和SKU,以及基于产品添加到的类别和目标市场的组合的一些其他关键信息(下面的示例).类别和目标市场不是产品的可配置属性,使用该系统的用户只能在特定组合下工作,例如Toys/USA.提到这一点的原因是我无法将表单设计为具有每个Category/Market组合的属性部分,它需要工作就像表单仅针对该类别/市场 - 用户不了解其他组合.
希望澄清可能情况的一些例子:
如果我要将产品添加到美国目标市场玩具类别中,我需要询问"年龄范围"和"它是否通过了安全检查".
如果我要将产品添加到Toys with Target Market Mexico类别,我只需要询问"年龄范围".
如果我要将产品添加到美国目标市场服装类别,我需要询问"样式"和"材料"
如果我要将产品添加到加拿大目标市场服装类别,我需要询问"样式","材料"和"美国价格"
我们有20个类别和12个目标市场,另外有10种形式需要以这种方式表现,因此理论上有2400种不同的行动/观点/模型
所以问题是,在ASP.NET MVC中,处理显示所有这些动态表单和处理发送到操作的数据变体的最佳方法是什么?
编辑
有关如何确定产品属性的说明:它们基于属于市场中类别的产品的层次结构.例如,它不是我们要求的所有玩具属性和美国属性的添加,它是在美国市场上销售的玩具产品的属性.在美国销售的玩具需要"安全检查"信息,但美国的服装不需要.墨西哥的玩具也不需要"安全检查"信息,因此该属性并非所有Toys或所有美国产品所固有,而是属于类别和市场的组合.
这两个代码块在功能上是相同的
if (myObj == null)
{
myObj = new MyObj();
}
Run Code Online (Sandbox Code Playgroud)
和
myObj = myObj ?? new MyObj();
Run Code Online (Sandbox Code Playgroud)
但是,使用null合并运算符的那个在myObj不为null的情况下执行不必要的赋值.但后来我想也许编译器可以优化这些自我分配.有谁知道编译器是否会注意到正在发生的事情并且基本上将底部片段转换为顶部片段?
我的Web应用程序在业务逻辑和表示逻辑上有一些细微的变化,具体取决于登录用户的类型.看起来通过根据用户类型注入不同的具体类来获得变化非常适合DI.所以我想知道我应该使用StructureMap的哪些功能来实现这一目标(或者如果我基于DI的目的而离开).
(我刚刚了解到配置文件不是实现此目的的方法,因为设置配置文件不是每线程操作:StructureMap配置文件线程安全吗?)
这是怎么回事?
public class HomeController
{
private ISomeDependancy _someDependancy;
public HomeController(ISomeDependancy someDependancy)
{
_someDependancy = someDependancy;
}
public string GetNameFromDependancy()
{
return _someDependancy.GetName();
}
}
public interface ISomeDependancy
{
string GetName();
}
public class VersionASomeDependancy : ISomeDependancy
{
public string GetName()
{
return "My Name is Version A";
}
}
public class VersionBSomeDependancy : ISomeDependancy
{
public string GetName()
{
return "My Name is Version B";
}
}
public class VersionARegistry : Registry
{
public VersionARegistry() …Run Code Online (Sandbox Code Playgroud) 为什么这不编译?
public interface IConcrete { }
public class Concrete : IConcrete { }
public class Runner
{
public static void Main()
{
var myList = new List<Concrete>();
DoStuffWithInterfaceList(myList); // compiler doesn't allow this
}
public static void DoStuffWithInterfaceList(List<IConcrete> listOfInterfaces) { }
}
Run Code Online (Sandbox Code Playgroud)
什么是将myList设置为正确类型的最快方法?
编辑我弄乱了DoStuffWithInterfaceList示例
如果我有一个在某种条件下调用自己的方法,是否可以编写测试来验证行为?我很想看到一个例子,我不关心模拟框架或语言.我在C#中使用RhinoMocks所以我很好奇它是否是框架的缺失特征,或者我是否误解了一些基本的东西,或者它是否是不可能的.
我的代码是......
public static void AssertNotNull<T>(string name, T val) {
if (val == null)
throw new ArgumentNullException(String.Format("{0} must not be null", name));
}
Run Code Online (Sandbox Code Playgroud)
Resharper推荐......
public static void AssertNotNull<T>(string name, T val) {
if (Equals(val, default(T)))
throw new ArgumentNullException(String.Format("{0} must not be null", name));
}
Run Code Online (Sandbox Code Playgroud) 任何人都知道VisualStudio中的任何内容,当你打开一堆名为同一个文件的文件时,你的生活会更轻松吗?通常我会打开一堆同名的文件,我不知道有什么方法可以区分它们,所以我只需要通过解决方案资源管理器.是否有设置为这个愚蠢的事情添加悬停文本的完整路径?
替代文字http://img518.imageshack.us/img518/2094/91544289.png
这与Visual Studio不完全相同 - 用于管理许多打开文件的工作的提示
我知道ctrl-tab提供了完整的路径,但它仍然有点麻烦,因为你必须向左箭头查看完整路径,并且当有大量文件打开时,它实际上并不比使用解决方案资源管理器快.
可以像这样添加列的默认值
ALTER TABLE [MyTable] ADD DEFAULT ((0)) FOR [MyColumn]
Run Code Online (Sandbox Code Playgroud)
或者像这样
ALTER TABLE [MyTable] ADD CONSTRAINT [DF_MyTable_MyColumn] DEFAULT ((0)) FOR [MyColumn]
Run Code Online (Sandbox Code Playgroud)
两者有什么区别?
句号,感叹号和星号有常见的俚语名称:
."点"
!"爆炸"
*"明星"
但是对于像
%
&
<
{
[
;; 这样的字符来说,有多个明显的单音节名称是什么
?
等等
.net ×2
c# ×2
architecture ×1
asp.net-mvc ×1
c#-4.0 ×1
mocking ×1
moq ×1
resharper ×1
rhino-mocks ×1
sql ×1
sql-server ×1
structuremap ×1
svn ×1
t-sql ×1
unit-testing ×1