小编Phi*_*ler的帖子

Webforms和依赖注入

我正在将依赖注入框架引入现有的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有更优雅的解决方案吗?

c# asp.net dependency-injection webforms castle-windsor

19
推荐指数
1
解决办法
1万
查看次数

扩展方法是否隐藏依赖关系?

所有,

想要对此有所了解.最近,我在设计/开发时越来越多地成为"纯粹的"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

16
推荐指数
2
解决办法
1788
查看次数

使用错误版本的程序集编译RDLC文件的MSBuild

我正在使用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),解决方案将编译.

msbuild reportviewer rdlc

13
推荐指数
4
解决办法
2万
查看次数

将TeamCity与BitBucket一起使用

我目前正在建立一个TeamCity构建服务器,它将从我们的git存储库中提取源代码,这些存储库是在Bitbucket上托管的.我正在为一个存储库执行此操作,这些存储库是作为Bitbucket团队(不是我的个人帐户)的一部分设置的.

我遇到的是URL路径似乎是每个用户自定义的.例如,我的路径如下:

https://MyUserName@bitbucket.org/TeamName/RepoName.git
Run Code Online (Sandbox Code Playgroud)

如果我要离开公司,这将是更新40多个版本的噩梦.

我考虑过在bitbucket上创建一个服务帐户供构建服务器使用,但这会占用我们的一个用户(我们只有10个用户的许可证).

是建议单独的帐户建议的方法,还是有更好的选择?

git teamcity bitbucket

13
推荐指数
1
解决办法
2万
查看次数

WebApp.Start <TStartup>方法类型参数

在基于本文使用Owin将我的Windows服务应用程序设置为自托管:

http://www.asp.net/web-api/overview/hosting-aspnet-web-api/use-owin-to-self-host-web-api

我使用了WebApp.Start方法的这个重载:

WebApp.Start方法(String)

这是我的代码:

//(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()方法的名称更改为其他内容怎么办?如果我将方法设为内部怎么办?我可以使用此类配置其他选项吗?

所有这些记录在哪里?我觉得没有上面链接的文章,我从来没有能够弄清楚要实现什么.

c# windows-services owin asp.net-web-api2

13
推荐指数
1
解决办法
4856
查看次数

我可以使用类型工厂设备返回基于(枚举)参数的实现吗?

不确定这是否可行.

我需要根据枚举值返回正确的服务实现.所以手工编码的实现看起来像:

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

12
推荐指数
1
解决办法
1987
查看次数

如何使用单向导航建模实体框架实体/映射

使用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

12
推荐指数
2
解决办法
4850
查看次数

从WPF迁移到Silverlight:主要差异是什么?

我做了使用WPF一个完整的项目,并有(至少)的主要概念,如XAML,数据绑定和MVVM一个很好的把握.我们"手工"完成了所有工作 - 我们没有使用MVVM框架或第三方工具.所有XAML都是手工编写的(没有Blend).

新项目,我会在几周内开始是相当重型Silverlight的,我期待起床尽快提速.然而,我读到的关于SL入门的大部分文章都集中在XAML和数据绑定上.自从我介绍这些概念仍然在我的记忆很新鲜,我当然可以理解为什么这些教程会花很多时间在这些问题上 - 的学习曲线是非常陡峭.然而,这些是我已经熟悉的概念,并且发现自己不得不涉足许多有限的理由来学习任何新的和令人信服的东西.

那么,我所寻找的是什么,我需要学习和了解从一个熟练工WPF'er到熟练工Silverlight'er去咨询.这可以是以下形式:

  • 一般建议
  • 关键差异
  • 经验法则
  • 资源/链接("WPFer的Silverlight指南"将是完美的:)
  • 主要陷阱/需要注意的事项

提前感谢您的任何见解.

silverlight wpf mvvm silverlight-4.0

11
推荐指数
1
解决办法
967
查看次数

使用GET的ASP.Net MVC模型绑定复杂对象

我的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一起工作?

javascript c# asp.net-mvc model-binding angularjs

10
推荐指数
2
解决办法
6179
查看次数

WPF:提高在旧PC上运行的性能

所以,我正在构建一个WPF应用程序,并在今天进行了测试部署,并发现它的表现非常糟糕.我很惊讶,因为我们在视觉效果或动画方面做得并不多.

我部署在两台机器上:运行应用程序所需的最快和最慢(最慢的PC具有Intel Celeron 1.80GHz和2GB RAM).该应用程序在较快的机器上运行得很好,但在较慢的机器上却不稳定.当我说"波涛汹涌"时,我的意思是光标跳过,甚至只是将它传递到有焦点的应用程序的任何打开的窗口.

我打开了"任务管理器性能"窗口,可以看到只要应用程序有焦点并且光标在其上移动,CPU使用率就会跳跃.如果我将焦点放在另一个(例如Excel)上,CPU使用率会在一秒后恢复.这发生在两台机器上,但是在较慢的机器上只有明显的波动.我只有非常有限的时间来修补部署机器,所以没有做很多详细的测试.

该应用程序在我的开发机器上运行良好,但我也看到CPU在那里飙升10%,只是将光标放在窗口上.

我从MS下载了WPF性能工具并且一直在修补它(在我的开发机器上).文档说明了Perforator工具中的"帧率"指标:

对于没有动画的应用程序,此值应接近0.

应用程序没有做任何繁重的动画,但当光标在任何窗口上时,帧速率保持在50附近.我测试过的屏幕在网格中有列标题"突出显示",滚动时会改变颜色和外观的按钮.即使在窗口的空白区域上移动鼠标也会导致相同的帧速率和CPU使用率(似乎与这些次要动画无关).

(另外,除了两个默认工具 - Perforator和Visual Profiler - 安装到WPF性能工具中之外,我无法弄清楚如何获得任何东西.这可能是一个单独的问题).

我也有Redgate的分析工具,但我不确定这是否可以解释渲染性能.

因此,我意识到在没有细节或示例代码(我无法发布)的情况下进行故障排除并不容易.我的问题是:

  • 在代码中寻找(或避免)以提高性能的一般常见事项是什么?
  • 我可以使用WPF性能工具采取哪些步骤来缩小问题范围?
  • 上面列出的PC规格(带有2GB RAM的Intel Celeron 1.80GHz)是否太慢而无法运行甚至是vanilla WPF应用程序?

wpf optimization performance rendering

9
推荐指数
1
解决办法
1231
查看次数