小编adr*_* h.的帖子

将DI容器使用保留在Silverlight和MVVM中的组合根目录中

我不太清楚如何设计所以我在Silverlight + MVVM应用程序的组合根目录中保留对DI容器的引用.

我有以下简单的使用场景:主视图(可能是项目列表)和打开一个项目的编辑视图的操作.因此,主视图必须在用户执行操作时创建并显示编辑视图(例如,单击某个按钮).

为此,我有以下代码:

public interface IView
{
   IViewModel ViewModel {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

然后,对于我需要能够创建的每个视图,我都有一个抽象工厂,就像这样

public interface ISomeViewFactory
{
   IView CreateView();
}
Run Code Online (Sandbox Code Playgroud)

然后将此工厂声明为"父"视图模型的依赖项,如下所示:

public class SomeParentViewModel
{
   public SomeParentViewModel(ISomeViewFactory viewFactory)
   {
       // store it
   }

   private void OnSomeUserAction()
   {
      IView view = viewFactory.CreateView();
      dialogService.ShowDialog(view);
   }       
} 
Run Code Online (Sandbox Code Playgroud)

所以一切都很好,直到这里,没有DI容器在视线:).现在来了ISomeViewFactory的实现:

public class SomeViewFactory : ISomeViewFactory
{
    public IView CreateView()
    {
        IView view = new SomeView();
        view.ViewModel = ????   
    }
}
Run Code Online (Sandbox Code Playgroud)

"????" 部分是我的问题,因为视图的视图模型需要从DI容器中解析,因此它会注入其依赖项.我不知道的是,除了组合根之外,如果没有对DI容器的依赖,我怎么能做到这一点.

一种可能的解决方案是对注入工厂的视图模型具有依赖性,如下所示:

public class SomeViewFactory : ISomeViewFactory
{
    public SomeViewFactory(ISomeViewModel viewModel)
    { …
Run Code Online (Sandbox Code Playgroud)

c# silverlight dependency-injection inversion-of-control mvvm

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

Visual Studio 2017使用C#7.2发布ASP.NET Core应用程序

我有一个正在使用的Asp.Net MVC Core网站public static async Task Main().为了实现这一点,我将语言版本设置为C#7.2(在属性 - >构建 - >高级对话框中,在csproj中双重检查)以进行调试和发布构建配置.

App在Debug和Release模式下构建并启动良好.

现在,我正试图直接从Visual Studio 2017 15.5.2(使用WebDeploy)将其发布到Azure网站,我得到了这个:

Program.cs(17,29):错误CS8107:功能'async main'在C#7.0中不可用.请使用语言版本7.1或更高版本.CSC(0,0):错误CS5001:程序不包含适用于入口点的静态"主"方法

在输出窗口中,我看到它正在运行C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\Roslyn\csc.exe一些标志,可能其中一个是错的?

任何人都知道这是一个已知问题还是我做错了什么?

c# azure asp.net-core visual-studio-2017

10
推荐指数
1
解决办法
556
查看次数

将Angular 1.x与TypeScript 1.5和SystemJS一起使用

我正在尝试使用Typeular 1.5.3和SystemJS的Angular 1.x. index.html页面已设置为System.import('bootstrapper')应该开始的页面.

bootstrapper.tsbootstrapper.js只要它不使用角度(即只做一个console.log()工作正常)编译到并工作正常

现在,我想导入并使用angular来引导它.我已经完成了jspm install angular,我还安装了一些角度使用的打字tsd.bootstrap.ts文件顶部引用了这些类型.

不幸的是,做import angular from 'angular'不编译,我明白了Module "angular" has no default export.我的问题是:

  1. 为什么不import angular from 'angular'编译?查看angular.d.ts文件,我看到declare module 'angular'{ export = angular; }哪个,如果我理解正确,是从变量的模块角度的默认导出(在上面的typing文件中定义)declare var angular: angular.IAngularStatic
  2. 我注意到import 'angular'编译然后我可以实际参考angular并做例如angular.module(...),但我不认为我正确理解这是如何工作的.不应该import 'angular'做"裸导入",即仅为其副作用运行模块?如果是这种情况,这是否意味着此导入实际上angular在全局范围内注册?

我很确定我没有正确理解模块/类型定义文件在Typescript中是如何工作的,提前感谢解释.

javascript angularjs typescript ecmascript-6 jspm

8
推荐指数
2
解决办法
3157
查看次数

Angular2 - 在用户更改选择后重置它的值

我有一个<select>用户可以更改的。最初它有一个值,当用户更改它时,我必须提示她"are you sure"?,如果答案是否定的,则将<select>选定的值改回前一个值。该<select>势必对象的集合,而不是值。

到目前为止,我能想到的最好的方法是:

  • 在html中
<select [ngModel]="selectedObj" (ngModelChange)="onSelectedObjChanged($event)">
    <option *ngFor="let obj of availableObjs" [ngValue]="obj">{{whatever}}<option>
</select>
Run Code Online (Sandbox Code Playgroud)
  • 在代码中
onSelectedObjChanged(obj) {
  if (prompt answer is no) {
     let currentlySelectedObj = this.selectedObj;
     this.selectedObj = null;
     this.changeDetectorRef.detectChanges();
     this.selectedObj = currentlySelectedObj;
     this.changeDetectorRef.detectChanges();
  }
}
Run Code Online (Sandbox Code Playgroud)

这有效,但很丑陋。我为什么要这样做:

  • 似乎没有办法取消 DOM 中的选择更改事件
  • onSelectedObjChanged被调用并且答案是“否”时,我需要以某种方式让 angular 知道它必须刷新绑定目标,即<select>...
  • ...但是我不能简单地设置this.selectedObj = this.selectedObj为值不变并且角度没有检测到变化;这就是为什么我将它设置为null并返回...
  • ...然而,即使这还不够,我需要调用changeDetectorRef.detectChanges()它来通知 angular

我相信有一种更好、更简单的方法可以做到这一点,如果您能分享一些想法,那就太好了。

谢谢!

javascript angularjs angular

7
推荐指数
2
解决办法
9175
查看次数

在Blend设计时使用Moq

这可能有点像,但假设我想在ViewModel中使用Moq来创建一些设计时数据,如下所示:

public class SomeViewModel
{
   public SomeViewModel(ISomeDependency dependency)
   {
      if (IsInDesignMode)
      {
         var mock = new Mock<ISomeDependency>();
         dependency = mock.Object; // this throws!  
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

模拟可以设置为做一些事情,但你明白了.

我的问题是,在Blend的设计时,这段代码抛出一个InvalidCastException,消息沿着"无法将类型为'Castle.Proxies.ISomeDependencyProxy2b3a8f3188284ff0b1129bdf3d50d3fc'的对象强制转换为'ISomeDependency'." 虽然这不一定看起来与Moq相关但与Castle相关,我希望Moq示例有帮助;)

知道为什么会这样吗?

谢谢!

silverlight wpf design-time mvvm expression-blend

5
推荐指数
1
解决办法
611
查看次数

Silverlight ClientHttp WebRequest超时

我有一个使用ClientHttp堆栈的silverlight 4应用程序来创建一个服务于二进制流的WebRequest.然后我从这个流中读取并做了一些事情.但是,我有以下问题:服务器缓冲它发送的数据,因此发送过程就像send-pause-send-pause-send ...

有时服务器暂停一段时间(大约20秒),此时连接似乎以某种方式中断.我在Silverlight中没有任何异常,实际上对于代码来说,它看起来像是从Web响应流中读取完成了(即没有更多数据).但是,服务器实际上并没有发送所有数据(我可以从非Silverlight应用程序测试,该应用程序将在该暂停后获得更多数据).我认为这可能是一些超时问题(从我读到的内容无法明确地在Silverlight中设置),但奇怪的是我没有得到指示超时的异常.此外,暂停时间不长,我希望20秒是合理的时间.

我还查看了TCP流量,看起来像暂停后,Silverlight会向服务器发送FIN消息.所以它似乎有点超时并决定打破连接,但它实际上并没有将超时报告为异常,或者给我任何方法来避免它.

任何想法实际发生了什么,我怎么能阻止它?

谢谢!

更新:发现问题.有一个注册表项控制系统范围的Web请求超时行为,一些应用程序将其设置为10秒(例如,随处安装)并"忘记"将其设置回来.关键是:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ReceiveTimeout

我把它改回了更大的价值,现在它工作正常!心连心.

silverlight webrequest clienthttpstack

5
推荐指数
1
解决办法
1325
查看次数

Asp.net Mvc 6登录后立即获得用户声明

在Asp.net Mvc 6网站上,我定制了开箱即用的功能,AccountController以便userManager.CreateAsync()在注册前添加自定义声明,

  • 使用本地帐户(电子邮件/密码),在Register()控制器的方法中
  • 与外部提供商(谷歌/ Facebook),在ExternalLoginConfirmation()控制器的

现在,我想做的是,在用户登录后立即执行

  • Login()调用signInManager.PasswordSignInAsync()和之后的方法中
  • ExternalLoginCallback()调用后的方法中signInManager.ExternalLoginSignInAsync()

...检索该声明,理想情况下无需访问数据库即可获取用户.

我注意到如果我在登录后直接看到User,则Claims集合为空.但是,如果我在后续控制器操作中查看它,则会填充Claims集合并在其中包含我的自定义声明.

问题是,为什么登录后不会立即填写索赔(我猜登录代码不会刷新CurrentPrincipal?)并且在登录后直接检查另一个地方以获取索赔而不会点击DB?

asp.net security claims-based-identity asp.net-core-mvc

5
推荐指数
1
解决办法
1213
查看次数

WebApi自定义JsonConverter未调用

我为Guids实现了一个自定义的JsonConverter.

如果我在序列化类的属性(类型为Guid)上声明它,就像这样

[JsonConverter(typeof(JsonGuidConverter))]
Run Code Online (Sandbox Code Playgroud)

然后它被调用并且工作正常.

但是,我想"自动"使用它,而不需要属性,所以我这样做:

var formatters = GlobalConfiguration.Configuration.Formatters;
var jsonFormatter = formatters.JsonFormatter;
jsonFormatter.SerializerSettings.Converters.Add(new JsonGuidConverter());
Run Code Online (Sandbox Code Playgroud)

不幸的是,这导致我的转换器永远不会被调用 我在MVC 5.1项目中使用WebApi 2.1.

有任何想法吗?

编辑:这是转换器代码

public class JsonGuidConverter : JsonConverter
{
    public override bool CanRead
    {
        get
        {
            // We only need the converter for writing Guids without dashes, for reading the default mechanism is fine
            return false;
        }
    }
    public override bool CanWrite
    {
        get
        {
            return true;
        }
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(Guid) || objectType == …
Run Code Online (Sandbox Code Playgroud)

json asp.net-web-api

3
推荐指数
1
解决办法
2078
查看次数