让我举个例子:
我有一些通用的类/接口定义:
interface IGenericCar< T > {...}
我有另一个类/接口,我想与上面的类相关,例如:
interface IGarrage< TCar > : where TCar: IGenericCar< (**any type here**) > {...}
基本上,我希望我的通用IGarrage依赖于IGenericCar,无论是否,IGenericCar<int>或者IGenericCar<System.Color>因为我对该类型没有任何依赖性.
我想我误解了Javascript原型继承是如何工作的.具体来说,原型内部变量似乎在多个不同的子对象之间共享.用代码说明最容易:
var A = function()
{
var internal = 0;
this.increment = function()
{
return ++internal;
};
};
var B = function() {};
// inherit from A
B.prototype = new A;
x = new B;
y = new B;
$('#hello').text(x.increment() + " - " + y.increment());?
Run Code Online (Sandbox Code Playgroud)
这输出1 - 2(在JSBin上测试),而我完全期望结果1 - 1,因为我想要两个单独的对象.
如何确保A对象不是多个实例之间的共享对象B?
更新:本文重点介绍了一些问题:
问题是每个方法用于创建一个工作正常的私有变量的范围,也就是操作中的闭包,如果您更改一个对象实例的私有变量,它将被更改为all.即它更像是私有静态属性,而不是实际的私有变量.
所以,如果你想拥有私有的东西,更像是非公共常量,上述任何一种方法都是好的,但不适用于实际的私有变量.私有变量仅适用于JavaScript中的单例对象.
解决方案:根据BGerrissen的回答,更改B原型的声明和离开按预期工作:
var B = function() { A.apply(this, arguments); };
Run Code Online (Sandbox Code Playgroud) 我有一个Angular 2服务,它需要在初始化时进行异步工作,并且在初始化完成之前不应该可用.
@Injectable()
export class Api {
private user;
private storage;
constructor(private http: Http) {
this.storage = LocalStorage;
this.storage.get('user').then(json => {
if (json !== "") {
this.user = JSON.parse(json);
}
});
}
// one of many methods
public getSomethingFromServer() {
// make a http request that depends on this.user
}
}
Run Code Online (Sandbox Code Playgroud)
按照目前的情况,此服务已初始化,并立即返回到使用它的任何组件.然后该组件调用getSomethingFromServer()它ngOnInit,但此时Api.user未初始化,因此发送了错误的请求.
生命周期钩子(OnInit,OnActivate等)不能用于服务,只能用于组件和指令,所以我不能使用它们.
从get()调用中存储Promise 将需要依赖于用户的所有不同方法等待它,从而导致大量代码重复.
在Angular 2中进行异步初始化服务的推荐方法是什么?
据我所知,不可能从任何块的右边框放置CSS背景图像1em,也不可能从底部放置图像1em.
以下代码从左侧放置背景图像1em,从顶部放置2em.
<div class="foo" style="background: url('bar.png') no-repeat 1em 2em">
Some text here
</div>
Run Code Online (Sandbox Code Playgroud)
如果框的大小是动态的并且假设您无法更改HTML,那么在CSS中是否有任何方式指定背景图像应该"远离右边缘"?
(百分比不起作用,因为盒子可以改变大小)
如果无法做到这一点,那么您需要对HTML进行的最小更改量是多少?
这是我提出的解决方法:
<style>
div.background
{
float: right;
background: url('bar.png') no-repeat top left;
margin-right: 1em;
width: 16px;
height: 16px;
}
</style>
<div class="foo">
<div class="background" style=""> </div>
Some text here
</div>
Run Code Online (Sandbox Code Playgroud) 我想将数据从服务器流式传输到MediaElement我的Windows 8商店(以前称为Metro)应用程序中.但是,我需要在流式传输时"记录"流,因此如果重新请求,它可以从缓存中提供,因此我不想直接将URL提供给MediaElement.
目前,绊脚石是MediaElement.SetSource()接受一个IRandomAccessStream,而不是一个System.IO.Stream,这是我得到的HttpWebResponse.GetResponseStream().
我现在的代码,它不起作用:
var request = WebRequest.CreateHttp(url);
request.AllowReadStreamBuffering = false;
request.BeginGetResponse(ar =>
{
var response = ((HttpWebResponse)request.EndGetResponse(ar));
// this is System.IO.Stream:
var stream = response.GetResponseStream();
// this needs IRandomAccessStream:
MediaPlayer.SetSource(stream, "audio/mp3");
}, null);
Run Code Online (Sandbox Code Playgroud)
是否有一个允许我传输音频的解决方案,但允许我在从远程端读完后将流复制到磁盘?
我正在尝试在一个新项目中对我的第一个存储库进行单元测试,我们决定使用EF6主要用于异步内容.我遇到了为我的模型伪造IDbSet的问题,并允许在使用新的异步细节之前使用任何Linq.
我正在使用这篇文章中提供的FakeDbSet .如果我做一个简单的查询,比如
await set.FirstOrDefaultAsync(e => e.Approved);
Run Code Online (Sandbox Code Playgroud)
这很棒.
我尝试这样做时会出现问题:
await set.OrderByDescending(e => e.Date)
.FirstOrDefaultAsync(e => e.Approved)`
Run Code Online (Sandbox Code Playgroud)
然后我收到一个错误:
System.InvalidOperationException:源IQueryable的提供程序未实现IDbAsyncQueryProvider.
通过拆分流畅的语法并检查每一步的结果,我很清楚IDbAsyncQueryProvider在第一个"普通"Linq运算符(例如OrderBy,Where或Select)之后消失.
我怎样才能让它发挥作用?
更新(因为有一些混乱):有2个项目; 称他们为存储库和测试.测试课程参考资料库.调用Where发生在Repository中,它不知道FakeDbSet(也不应该知道它,因为它是一个仅测试类).
我想提供一个Javascript代码,它可以在任何包含它的网站上运行,但它总是需要在托管Javascript的服务器上获取更多数据(甚至修改数据).我知道出于明显的原因存在安全限制.
考虑在xyz.com上托管的index.html,其中包含以下内容:
<script type="text/javascript" src="http://abc.com/some.js"></script>
Run Code Online (Sandbox Code Playgroud)
some.js是否能够使用XMLHttpRequest将数据发布到abc.com?换句话说,abc.com是否被隐含信任,因为我们从那里加载了Javascript?
通过我为MaxTo自动崩溃收集,我得到了以下崩溃报告:
V8.12.0.0 - System.ComponentModel.Win32Exception - :Void UpdateLayered():0
Version: MaxTo8.12.0.0
Exception: System.ComponentModel.Win32Exception
Error message: Not enough storage is available to process this command
Stack trace:
at System.Windows.Forms.Form.UpdateLayered()
at System.Windows.Forms.Form.OnHandleCreated(EventArgs e)
at System.Windows.Forms.Control.WmCreate(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ContainerControl.WndProc(Message& m)
at System.Windows.Forms.Form.WmCreate(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at MaxTo.MainForm.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Run Code Online (Sandbox Code Playgroud)
另一个堆栈跟踪:
Version: MaxTo2009.9.0.0
Exception: System.ComponentModel.Win32Exception
Error message: Not enough storage is available to …Run Code Online (Sandbox Code Playgroud) 是否可以在PHP中使用.NET方法属性的等价物,或以某种方式模拟这些?
上下文
我们有一个我们非常喜欢的内部URL路由类.它今天的工作方式是我们首先必须使用中央路由管理器注册所有路由,如下所示:
$oRouteManager->RegisterRoute('admin/test/', array('CAdmin', 'SomeMethod'));
$oRouteManager->RegisterRoute('admin/foo/', array('CAdmin', 'SomeOtherMethod'));
$oRouteManager->RegisterRoute('test/', array('CTest', 'SomeMethod'));
Run Code Online (Sandbox Code Playgroud)
无论何时遇到路由,都会调用回调方法(在上面的情况下,它们是静态类方法).但是,这会将路径与方法分开,至少在代码中是这样.
我正在寻找一些方法来使路线更接近方法,就像你在C#中所做的那样:
<Route Path="admin/test/">
public static void SomeMethod() { /* implementation */ }
Run Code Online (Sandbox Code Playgroud)
我现在看到的选项是要么创建某种phpDoc扩展,允许我这样的东西:
/**
* @route admin/test/
*/
public static function SomeMethod() { /* implementation */ }
Run Code Online (Sandbox Code Playgroud)
但这需要为phpDoc编写/重用解析器,并且很可能会很慢.
另一种选择是将每个路由分成它自己的类,并使用如下方法:
class CAdminTest extends CRoute
{
public static function Invoke() { /* implementation */ }
public static function GetRoute() { return "admin/test/"; }
}
Run Code Online (Sandbox Code Playgroud)
但是,这仍然需要注册每个类,并且会有很多这样的类(更不用说额外的代码量).
那么我的选择是什么?保持路线接近它调用的方法的最佳方法是什么?
我们运营一个中等规模的网站,每天可以获得数十万的综合浏览量.直到上周末,我们在虚拟机上运行的负载通常低于0.2.操作系统是Ubuntu.
在部署最新版本的应用程序时,我们在部署之前也进行了apt-get dist-upgrade.在我们部署之后,我们注意到CPU上的负载急剧上升(有时达到10并且停止响应页面请求).
我们尝试从PHP中倾倒整整一分钟的Xdebug分析数据,但是通过它只显示了一些有点慢的部分,但没有什么可以解释这个巨大的跳跃.
我们现在很确定我们网站的新版本中没有任何内容可以解决问题,但我们无法确定.我们已经回滚了很多变化,但问题仍然存在.
在查看进程时,我们发现单个Apache进程在更长的时间内使用相当多的CPU而不是严格必要的.但是,当在受影响的进程上使用strace时,我们从未看到任何东西
accept(3,
Run Code Online (Sandbox Code Playgroud)
它在接收新连接之前会挂起一段时间,所以我们实际上无法看到导致问题的原因.
堆栈是PHP 5,Apache 2(prefork),MySQL 5.1.大多数东西都通过Memcached运行.我们尝试过APC和eAccelerator.
那么,我们的下一步应该是什么?有没有我们忽略/不了解的分析方法?
c# ×4
javascript ×2
php ×2
.net ×1
ajax ×1
angular ×1
apache ×1
async-await ×1
attributes ×1
css ×1
decorator ×1
generics ×1
html ×1
methods ×1
mysql ×1
performance ×1
typescript ×1
unit-testing ×1
url-routing ×1
where ×1
winapi ×1
windows-8 ×1
xhtml ×1
xss ×1