我不太清楚如何设计所以我在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
我有一个正在使用的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一些标志,可能其中一个是错的?
任何人都知道这是一个已知问题还是我做错了什么?
我正在尝试使用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.我的问题是:
import angular from 'angular'编译?查看angular.d.ts文件,我看到declare module 'angular'{ export = angular; }哪个,如果我理解正确,是从变量的模块角度的默认导出(在上面的typing文件中定义)declare var angular: angular.IAngularStaticimport 'angular'编译然后我可以实际参考angular并做例如angular.module(...),但我不认为我正确理解这是如何工作的.不应该import 'angular'做"裸导入",即仅为其副作用运行模块?如果是这种情况,这是否意味着此导入实际上angular在全局范围内注册?我很确定我没有正确理解模块/类型定义文件在Typescript中是如何工作的,提前感谢解释.
我有一个<select>用户可以更改的。最初它有一个值,当用户更改它时,我必须提示她"are you sure"?,如果答案是否定的,则将<select>选定的值改回前一个值。该<select>势必对象的集合,而不是值。
到目前为止,我能想到的最好的方法是:
<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)
这有效,但很丑陋。我为什么要这样做:
onSelectedObjChanged被调用并且答案是“否”时,我需要以某种方式让 angular 知道它必须刷新绑定目标,即<select>...this.selectedObj = this.selectedObj为值不变并且角度没有检测到变化;这就是为什么我将它设置为null并返回...changeDetectorRef.detectChanges()它来通知 angular我相信有一种更好、更简单的方法可以做到这一点,如果您能分享一些想法,那就太好了。
谢谢!
这可能有点像,但假设我想在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示例有帮助;)
知道为什么会这样吗?
谢谢!
我有一个使用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
我把它改回了更大的价值,现在它工作正常!心连心.
在Asp.net Mvc 6网站上,我定制了开箱即用的功能,AccountController以便userManager.CreateAsync()在注册前添加自定义声明,
Register()控制器的方法中ExternalLoginConfirmation()控制器的现在,我想做的是,在用户登录后立即执行
Login()调用signInManager.PasswordSignInAsync()和之后的方法中ExternalLoginCallback()调用后的方法中signInManager.ExternalLoginSignInAsync()...检索该声明,理想情况下无需访问数据库即可获取用户.
我注意到如果我在登录后直接看到User,则Claims集合为空.但是,如果我在后续控制器操作中查看它,则会填充Claims集合并在其中包含我的自定义声明.
问题是,为什么登录后不会立即填写索赔(我猜登录代码不会刷新CurrentPrincipal?)并且在登录后直接检查另一个地方以获取索赔而不会点击DB?
我为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) silverlight ×3
angularjs ×2
c# ×2
javascript ×2
mvvm ×2
angular ×1
asp.net ×1
asp.net-core ×1
azure ×1
design-time ×1
ecmascript-6 ×1
json ×1
jspm ×1
security ×1
typescript ×1
webrequest ×1
wpf ×1