我想拿一个对象,让我们说这个对象:
public class BenchmarkList
{
public string ListName { get; set; }
public IList<Benchmark> Benchmarks { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并让该对象将其ListName显示为PropertiesGrid的"name"部分("Benchmark"将是好的),并且对于PropertyGrid的"value"部分,要有一个IList <> of Benchmarks的下拉列表:
这是Benchmark对象
public class Benchmark
{
public int ID {get; set;}
public string Name { get; set; }
public Type Type { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我希望下拉列表显示基准的Name属性,以便用户可以看到.这是一个视觉示例:
所以,基本上,我正在尝试将Benchmark对象的集合放入下拉列表中,并且这些对象应该将其Name属性显示为下拉列表中的值.
我已经阅读了有关使用PropertiesGrid的其他文章,包括THIS和THIS,但它们比我想做的更复杂.
我经常处理服务器端的东西,并且不通过WebForms或WinForms处理UI,所以这个PropertiesGrid真的带我去旅行......
我知道我的解决方案在于实现"ICustomTypeDescriptor",这将允许我告诉PropertiesGrid它应该显示哪些值,而不管我想要绑定到下拉列表中的对象的属性,但我是只是不确定如何或在何处实施它.
任何指针/帮助将非常感激.
谢谢,迈克
更新:
好的,所以我正在改变一些细节.我之前想过应该参与的对象,所以这是我的新方法.
我有一个名为Analytic的对象.这是应该绑定到PropertiesGrid的对象.现在,如果我公开一个枚举类型的属性,PropertiesGrid将为我处理下拉列表,这是非常好的.如果我公开一个属于自定义类型集合的属性,那么PropertiesGrid就不那么好......
以下是Analytic的代码,我想要绑定到PropertiesGrid的对象:
public class Analytic
{
public enum Period { Daily, Monthly, Quarterly, Yearly };
public Analytic()
{ …
Run Code Online (Sandbox Code Playgroud) 我在locahost上运行MVC3站点时遇到此错误.它是一个刚刚创建的新MVC3站点,该HomeController
Index
方法是在ViewBag.Message
作业中被抛出的地方.
public ActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET MVC!";
return View();
}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
at System.Runtime.CompilerServices.CallSiteBinder.BindCore[T](CallSite`1 site, Object[] args)
at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site, T0 arg0, T1 arg1)
at MVC3.Web.UI.Controllers.HomeController.Index() in C:\Users\mccarthy\Documents\Visual Studio 2010\Projects\MVC3\MVC3.Web.UI\Controllers\HomeController.cs:line 13
at lambda_method(Closure , ControllerBase , Object[] )
at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
Run Code Online (Sandbox Code Playgroud)
我不知道这个错误是什么,以前没见过.当我启动一个新的MVC2项目(直到这一点我一直在使用)时,该网站运行得很好.
Microsoft如何处理MVC3和MVC2框架之间的安全性有什么不同?
首先,不是我没有使用ORM,我也不允许.我必须使用ADO.NET手动滚动我的存储库.
我有两个对象:
public class Firm
{
public Guid Id { get; set; }
public string Name { get; set; }
public virtual IEnumerable<User> Users { get; set; }
}
public class User
{
public Guid Id { get; set; }
public string Username { get; set; }
public Firm Firm { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
注意彼此的引用,公司有一个用户列表,每个用户只有一个公司.
现在我想设计我的存储库:
public interface IFirmRepository
{
IEnumerable<Firm> FindAll();
Firm FindById(Guid id);
}
public interface IUserRepository
{
IEnumerable<User> FindAll();
IEnumerable<User> FindByFirmId(Guid firmId);
User FindById(Guid id);
} …
Run Code Online (Sandbox Code Playgroud) .net c# dependency-injection circular-dependency repository-pattern
所以,我在这里查看了一些关于规范模式的帖子,但还没有找到答案.
我的问题是,在一个n层架构中,我应该在哪些规范中获得"新建"?
我可以将它们放在我的服务层(也就是说,应用层,它有时被称为......基本上,.aspx代码隐藏的东西会与之交谈),但我觉得通过这样做,我让业务规则漏掉了域名.如果以其他方式(除了服务层)访问域对象,则域对象无法强制执行自己的业务规则.
我可以通过构造函数注入将规范注入到我的Model类中.但同样,这感觉"错误".我觉得唯一应该注入Model类的是"服务",比如缓存,日志记录,脏标记跟踪等等......如果你能避免它,那么使用Aspects而不是乱丢模型的构造函数具有大量服务接口的类.
我可以通过方法注入(有时称为"Double Dispatch")注入规范,并明确地使用该方法封装注入的规范以强制执行其业务规则.
创建一个"域服务"类,它将通过构造函数注入获取规范,然后让服务层使用域服务来协调Domain对象.这对我来说似乎没问题,因为规范强制执行的规则仍然在"域"中,而Domain Service类的命名方式与它正在协调的Domain对象非常相似.这里的事情是我觉得我正在编写大量的类和代码,只是为了"正确"实现规范模式.
除此之外,相关规范要求存储库以确定它是否"满意".
这可能会导致性能问题,尤其是 如果我使用构造函数注入b/c消耗代码可以调用一个可能包装规范的属性,并且反过来调用数据库.
所以任何想法/想法/链接到文章?
新产品和使用规格的最佳位置在哪里?
domain-driven-design specification-pattern n-layer application-layer
好的,所以这是我的web.config文件的片段:
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<location path="." inheritInChildApplications="false">
<connectionStrings>
...
</connectionStrings>
</location>
<location path="." inheritInChildApplications="false">
<appSettings>
<!--IT Ops-->
<add key="SomeOtherKey" value="SomeOtherValue" />
<add key="SiteDomain" value="somedomain.com" />
<add key="SomeOtherKey" value="SomeOtherValue" />
....
</appSettings>
</location>
</configuration>
Run Code Online (Sandbox Code Playgroud)
我要做的是通过Powershell使用xPath找到节点.有关此XML文件的一些注意事项:
有多个:
<location path="." inheritInChildApplications="false">
Run Code Online (Sandbox Code Playgroud)
xml文件中的值.他们围绕其他节点等...
我可以使用此脚本成功找到并替换连接字符串值
$WebConfigFile = Join-Path $destination Web.config
[xml]$WebConfigXml = Get-Content ($WebConfigFile)
$WebConfigXml.configuration.location[2].connectionStrings.add | % { $_.connectionString = $_.connectionString -replace "some value", $sqlServerName }
Run Code Online (Sandbox Code Playgroud)
但是当我使用这个脚本替换add key ="SiteDomain"值时:
$node = $WebConfigXml.configuration.location[3].appSettings.SelectSingleNode("add[@key = 'SiteDomain']")
$node.value = "someValue"
$WebConfigXml.Save($WebConfigFile)
Run Code Online (Sandbox Code Playgroud)
这是行不通的.在这种情况下,$ node值包含一个空字符串.
我也试图像这样读取节点:
$appSettingsSection = …
Run Code Online (Sandbox Code Playgroud) 现在,我有一个名为StyleBundle的域名实体.这个StyleBundle有一个样式列表:
public class StyleBundle
{
public StyleBundle(List<Style> styles)
{
this.Styles = styles;
}
public IEnumerable<Style> Styles { get; private set;}
}
Run Code Online (Sandbox Code Playgroud)
因此,在我的原始设计中,永远不应该使用空样式列表创建StyleBundle.领域专家基本上说这是一个很好的规则.
我在构造函数中使用guard子句写了这个:
if (styles.Count() == 0)
throw new Exception("You must have at least one Style in a StyleBundle.");
Run Code Online (Sandbox Code Playgroud)
这确保我无法在无效状态下创建StyleBundle.我认为这里的异常是有道理的b/ca StyleBundle在没有至少一个Style的情况下被创建在系统中是特殊的.
当然,在项目的其余部分进行改变时,现在应该可以让用户创建没有样式的StyleBundle,但是不应该允许他们在没有样式的情况下使用StyleBundle.
所以现在我正在查看我的guard子句,并意识到我不能再从构造函数中抛出异常了.
接下来,我有一个服务/应用程序层,我的代码隐藏在他们使用StyleBundles时与之交互.在我的服务层中,我有一个StyleBundleService类,该类向UI公开基本功能......其中包括"CreateStyleBundle".
似乎我必须检查我的服务层以查看StyleBundle在持久存储到数据库之前是否有任何样式,但是这个决定对我来说感觉"错误".
有人碰到类似的事吗?基本上,当"新建"时对象的状态与持久性时相同对象的状态之间的差异?
谢谢!麦克风
c# ×2
.net ×1
asp.net ×1
n-layer ×1
powershell ×1
propertygrid ×1
validation ×1
web-config ×1
winforms ×1
xpath ×1