我正在将依赖注入框架引入现有的WebForms应用程序(使用Castle Windsor).
我对DI有很深的经验,并且倾向于非常强烈地支持构造函数注入而不是setter注入.如果您熟悉Webforms,您就会知道ASP.Net框架处理页面和控件对象的构造,从而无法进行真正的构造函数注入.
我目前的解决方案是在Global.asax的Application_Start事件中注册容器,并将容器保存为Global中的公共静态变量.然后,我只需在页面中直接解析我需要的每项服务,或在需要时控制它.所以在每个页面的顶部,我最终得到这样的代码:
private readonly IMyService _exposureManager = Global.IoC.Resolve<IMyService>();
private readonly IMyOtherService _tenCustomersExposureManager = Global.IoC.Resolve<IMyOtherService>();
Run Code Online (Sandbox Code Playgroud)
显然,我不喜欢将所有这些对容器的引用分散在我的应用程序中,或者我的页面/控件依赖关系是非显式的,但我还是找不到更好的方法.
在Webforms中使用DI有更优雅的解决方案吗?
所有,
想要对此有所了解.最近,我在设计/开发时越来越多地成为"纯粹的"DI/IOC原则的订户.其中一部分(很大一部分)涉及确保我的类之间几乎没有耦合,并且它们的依赖关系是通过构造函数解决的(当然还有其他方法来管理它,但你明白了).
我的基本前提是扩展方法违反了DI/IOC的原则.
我创建了以下扩展方法,以确保插入到数据库表中的字符串被截断为正确的大小:
public static class StringExtensions
{
public static string TruncateToSize(this string input, int maxLength)
{
int lengthToUse = maxLength;
if (input.Length < maxLength)
{
lengthToUse = input.Length;
}
return input.Substring(0, lengthToUse);
}
}
Run Code Online (Sandbox Code Playgroud)
然后我可以从另一个类中调用我的字符串,如下所示:
string myString = "myValue.TruncateThisPartPlease.";
myString.TruncateToSize(8);
Run Code Online (Sandbox Code Playgroud)
不使用扩展方法对此进行公平的翻译将是:
string myString = "myValue.TruncateThisPartPlease.";
StaticStringUtil.TruncateToSize(myString, 8);
Run Code Online (Sandbox Code Playgroud)
使用上述任一示例的任何类都无法独立于包含TruncateToSize方法的类(除了TypeMock)进行测试.如果我没有使用扩展方法,并且我不想创建静态依赖项,它看起来更像:
string myString = "myValue.TruncateThisPartPlease.";
_stringUtil.TruncateToSize(myString, 8);
Run Code Online (Sandbox Code Playgroud)
在最后一个示例中,_stringUtil依赖项将通过构造函数解析,并且可以测试该类,而不依赖于实际的TruncateToSize方法的类(可以很容易地模拟).
从我的角度来看,前两个示例依赖于静态依赖(一个显式,一个隐藏),而第二个反转依赖性并提供减少的耦合和更好的可测试性.
那么扩展方法的使用是否与DI/IOC原则相冲突?如果您是IOC方法的订阅者,您是否避免使用扩展方法?
extension-methods dependencies inversion-of-control testability c#-3.0
我正在使用VS 2010的reportviewer控件来创建客户端报告(rdlc).在我的开发机器上一切正常,当我手动编译(通过VS2010)并手动部署到没有安装开发工具的测试机器时.
为了使测试机器能够正常工作(不安装VS2010或ReportViewer.exe),我必须在我的项目中添加对Microsoft.ReportViewer.Winforms,Microsoft.ReportViewer.Common和Microsoft.ReportViewer.ProcessingModel的引用并将它们全部"复制本地".
我有为Build Action配置的rdlc文件=>嵌入式资源.这是向项目添加新rdlc时的默认设置.我愿意配置这个,否则如果这会解决这个问题(不知道它是否相关).
问题:由于添加了rdlc文件,解决方案不再构建在构建服务器上.我在构建服务器上安装了ReportViewer.exe,并验证了GAC中是否存在所需的程序集..Net 4框架未安装在构建服务器上 - 我不认为这是必需的,因为该解决方案针对3.5运行时.
我相信问题的根源是构建日志中的以下内容:
目标"RunRdlCompiler":完全构建目标"RunRdlCompiler".输出文件"obj\Release\RdlCompile.compiled"不存在.使用程序集"Microsoft.ReportViewer.Common,Version = 9.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a"中的"RdlCompile"任务.任务"RdlCompile":Report\RDLC\GreenReport.rdlc(0,0):error rsInvalidReportDefinition:报告定义无效.详细信息:报表定义具有无效的目标命名空间" http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition ",无法升级.
据我所知,Microsoft.ReportViewer.Common版本10.0.0.0应该用于"编译"rdlc,但MSBuild似乎使用9.0.0.0.我相信如果我可以强制它使用正确的版本(安装在GAC中的IS),解决方案将编译.
我目前正在建立一个TeamCity构建服务器,它将从我们的git存储库中提取源代码,这些存储库是在Bitbucket上托管的.我正在为一个存储库执行此操作,这些存储库是作为Bitbucket团队(不是我的个人帐户)的一部分设置的.
我遇到的是URL路径似乎是每个用户自定义的.例如,我的路径如下:
https://MyUserName@bitbucket.org/TeamName/RepoName.git
Run Code Online (Sandbox Code Playgroud)
如果我要离开公司,这将是更新40多个版本的噩梦.
我考虑过在bitbucket上创建一个服务帐户供构建服务器使用,但这会占用我们的一个用户(我们只有10个用户的许可证).
是建议单独的帐户建议的方法,还是有更好的选择?
在基于本文使用Owin将我的Windows服务应用程序设置为自托管:
http://www.asp.net/web-api/overview/hosting-aspnet-web-api/use-owin-to-self-host-web-api
我使用了WebApp.Start方法的这个重载:
这是我的代码:
//(in startup method)
_server = WebApp.Start<Startup>(BaseAddress);
public class Startup
{
// This code configures Web API. The Startup class is specified as a type
// parameter in the WebApp.Start method.
public void Configuration(IAppBuilder appBuilder)
{
// Configure Web API for self-host.
var config = new HttpConfiguration();
config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new
{
id = RouteParameter.Optional
});
appBuilder.UseWebApi(config);
}
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,所以没有抱怨.
但是Start方法的类型参数的要求究竟是什么?它似乎没有任何约束,我无法找到有关此参数的选项/要求的任何文档.它是否寻找将IAppBuilder作为参数的方法?如果我将Configuration()方法的名称更改为其他内容怎么办?如果我将方法设为内部怎么办?我可以使用此类配置其他选项吗?
所有这些记录在哪里?我觉得没有上面链接的文章,我从来没有能够弄清楚要实现什么.
不确定这是否可行.
我需要根据枚举值返回正确的服务实现.所以手工编码的实现看起来像:
public enum MyEnum
{
One,
Two
}
public class MyFactory
{
public ITypeIWantToCreate Create(MyEnum type)
{
switch (type)
{
case MyEnum.One
return new TypeIWantToCreate1();
break;
case MyEnum.Two
return new TypeIWantToCreate2();
break;
default:
return null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
返回的实现具有额外的依赖关系,需要通过容器注入,因此手动工厂将无法工作.
这是可能的,如果是这样,注册会是什么样的?
c# dependency-injection castle-windsor typed-factory-facility
使用EF 5,Code First.
我想对我的实体进行建模,使得导航属性仅存在于关系的一侧.
所以如果我有一个表格Widget和一个表格WidgetType:
public class Widget
{
public int Id { get; set; }
public int WidgetTypeId { get; set; }
public WidgetType WidgetType { get; set; }
}
public class WidgetType
{
public int Id { get; set; }
//note there is no collection of Widgets here
}
public class WidgetMap : EntityTypeConfiguration<Widget>
{
public WidgetMap()
{
HasKey(t => t.Id);
//totable, etc.
HasRequired(t => t.WidgetType); //what else is needed?
}
}
Run Code Online (Sandbox Code Playgroud)
我永远不会想要从widgetType的角度来获取小部件,所以对我来说无论如何都没有WidgetType实体上的导航属性.
如何在不必向WidgetType添加属性的情况下完成代码示例中提到的映射代码?这可能吗?
c# entity-framework navigation-properties ef-code-first entity-framework-5
我做了使用WPF一个完整的项目,并有(至少)的主要概念,如XAML,数据绑定和MVVM一个很好的把握.我们"手工"完成了所有工作 - 我们没有使用MVVM框架或第三方工具.所有XAML都是手工编写的(没有Blend).
新项目,我会在几周内开始是相当重型Silverlight的,我期待起床尽快提速.然而,我读到的关于SL入门的大部分文章都集中在XAML和数据绑定上.自从我介绍这些概念仍然在我的记忆很新鲜,我当然可以理解为什么这些教程会花很多时间在这些问题上 - 的学习曲线是非常陡峭.然而,这些是我已经熟悉的概念,并且发现自己不得不涉足许多有限的理由来学习任何新的和令人信服的东西.
那么,我所寻找的是什么,我需要学习和了解从一个熟练工WPF'er到熟练工Silverlight'er去咨询.这可以是以下形式:
提前感谢您的任何见解.
我的web项目中有一个类:
public class MyClass
{
public int? Param1 { get; set; }
public int? Param2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是我的控制器方法中的参数:
public ActionResult TheControllerMethod(MyClass myParam)
{
//etc.
}
Run Code Online (Sandbox Code Playgroud)
如果我使用POST调用方法,模型绑定会自动生效(我在js侧使用angular,这可能无关紧要):
$http({
method: "post",
url: controllerRoot + "TheControllerMethod",
data: {
myParam: myParam
}
}).success(function (data) {
callback(data);
}).error(function () {
alert("Error getting my stuff.");
});
Run Code Online (Sandbox Code Playgroud)
如果我使用GET,则控制器中的参数始终为null.
$http({
method: "get",
url: controllerRoot + "TheControllerMethod",
params: {
myParam: myParam
}
}).success(function (data) {
callback(data);
}).error(function () {
alert("Error getting my stuff.");
});
Run Code Online (Sandbox Code Playgroud)
使用默认模型绑定器的复杂模型绑定是否仅适用于POST,或者我可以做些什么来使其与GET一起工作?
所以,我正在构建一个WPF应用程序,并在今天进行了测试部署,并发现它的表现非常糟糕.我很惊讶,因为我们在视觉效果或动画方面做得并不多.
我部署在两台机器上:运行应用程序所需的最快和最慢(最慢的PC具有Intel Celeron 1.80GHz和2GB RAM).该应用程序在较快的机器上运行得很好,但在较慢的机器上却不稳定.当我说"波涛汹涌"时,我的意思是光标跳过,甚至只是将它传递到有焦点的应用程序的任何打开的窗口.
我打开了"任务管理器性能"窗口,可以看到只要应用程序有焦点并且光标在其上移动,CPU使用率就会跳跃.如果我将焦点放在另一个(例如Excel)上,CPU使用率会在一秒后恢复.这发生在两台机器上,但是在较慢的机器上只有明显的波动.我只有非常有限的时间来修补部署机器,所以没有做很多详细的测试.
该应用程序在我的开发机器上运行良好,但我也看到CPU在那里飙升10%,只是将光标放在窗口上.
我从MS下载了WPF性能工具并且一直在修补它(在我的开发机器上).文档说明了Perforator工具中的"帧率"指标:
对于没有动画的应用程序,此值应接近0.
应用程序没有做任何繁重的动画,但当光标在任何窗口上时,帧速率保持在50附近.我测试过的屏幕在网格中有列标题"突出显示",滚动时会改变颜色和外观的按钮.即使在窗口的空白区域上移动鼠标也会导致相同的帧速率和CPU使用率(似乎与这些次要动画无关).
(另外,除了两个默认工具 - Perforator和Visual Profiler - 安装到WPF性能工具中之外,我无法弄清楚如何获得任何东西.这可能是一个单独的问题).
我也有Redgate的分析工具,但我不确定这是否可以解释渲染性能.
因此,我意识到在没有细节或示例代码(我无法发布)的情况下进行故障排除并不容易.我的问题是:
c# ×5
wpf ×2
angularjs ×1
asp.net ×1
asp.net-mvc ×1
bitbucket ×1
c#-3.0 ×1
dependencies ×1
git ×1
javascript ×1
msbuild ×1
mvvm ×1
optimization ×1
owin ×1
performance ×1
rdlc ×1
rendering ×1
reportviewer ×1
silverlight ×1
teamcity ×1
testability ×1
webforms ×1