我想使用AutoFac在需要它的对象中注入当前主体.假设我有一个AuthorizationValidator正在执行安全检查的object().它看起来像这样:
public AuthorizationValidator : IAuthorizationValidator
{
public AuthorizationValidator(IDataAccess dataAccess, IPrincipal principal)
{
// Save injected objects
...
}
public bool CheckPermission(Guid objectId, Action action)
{
// Check if we are authorized at all
if (this.principal == null)
return false;
// Check the permission in the database
...
}
}
Run Code Online (Sandbox Code Playgroud)
对于我的Web应用程序,AuthorizationValidator已注册,我使用以下注册来注入主体:
builder.Register<IPrincipal>((c, p) => HttpContext.Current?.User);
Run Code Online (Sandbox Code Playgroud)
其他类型的应用程序使用线程的主体或类似的东西.需要主体的所有对象都会注入适当的主体.
如果未经授权进行调用,则AutoFac会引发异常,告诉我它无法提供IPrincipal对象,因为工厂已返回null.在这种情况下,空主体是好的,不应引发异常.
将Azure中的服务从经典模型迁移到Azure资源管理器(ARM)时,经典模型中可能会有一些保留的IP地址。保留IP的ARM副本是公用IP。创建新的公共IP将产生另一个IP地址,并可能导致将您的IP地址列入白名单的客户端出现问题。
尽管最好使用基于FQDN的白名单。但是,有时这是不可能的,IP白名单是次佳的选择。如何在不获取新IP地址的情况下从保留IP地址迁移到公共IP地址?
我创建了一个接受一些属性的指令,并使用这些属性初始化隔离的作用域.如果未指定属性,则应使用计算值初始化隔离范围.
我添加了一个链接函数来检查范围并初始化默认值(如果没有使用属性设置值).范围已初始化,但如果我设置了默认值,那么框架将稍后覆盖它.
解决方法是使用$ timeout(...)并在之后设置它,但这似乎太过分了.
function ($timeout) {
return {
scope: { msg1: '@', msg2: '@' },
template: '<div>{{msg1}} {{msg2}} {{msg3}}</div>',
link: function ($scope, $elt, $attr) {
var action = function() {
if (!$scope.msg2) $scope.msg1 = 'msg1';
if (!$scope.msg2) $scope.msg2 = 'msg2';
if (!$scope.msg3) $scope.msg3 = 'msg3';
};
action();
//$timeout(action, 0);
}
};
});
Run Code Online (Sandbox Code Playgroud)
我准备了一个JSFiddle来说明发生了什么.
似乎AngularJS在创建控制器并将指令链接到DOM之后创建范围并更新其值.谁能告诉我推荐的方法呢?
我正在尝试将网络摄像头中的视频编码为 VP8 流。使用 Chrome 从我的网络摄像头发送 WebRTC 流看起来非常好,并且不会占用大量 CPU 资源。当我尝试使用 FFMPEG 将我的网络摄像头流转码为 VP8 (webm) 时,它非常非常慢。
在 OS XI 上,使用以下 FFMPEG 选项生成 VP8 webm 文件。来源是一个 720p Facetime 网络摄像头。它耗尽了我的 CPU 使用率(2011 年末核心 i7 MBP)并且质量不是很好:
ffmpeg -f avfoundation -i 'default' -y -qmin 11 -qmax 45 -b:v 500k -cpu-used 0 -deadline realtime test.webm
Run Code Online (Sandbox Code Playgroud)
WebRTC 使用哪种协议,Chrome 怎么能这么快?我的印象是 VP8 不能在硬件中完成。使用现代英特尔 CPU,您可以使用 QuickSync,但我猜这只是 H.264,FFMPEG 不支持。
假设以下代码:
private async Task Test1Async() => await Task.Delay(1000).ConfigureAwait(false);
private Task Test2Async() => Test1Async();
Run Code Online (Sandbox Code Playgroud)
从功能上讲,这些功能完全相同,但是编译器对待调用这些方法的方式有所不同。以下代码可以编译,但是会发出CS4014警告:
private void Test() => Test1Async(); // CS4014 is shown
Run Code Online (Sandbox Code Playgroud)
它生成警告“ 因为未等待此调用,当前方法在调用完成之前继续运行 ”。这是一个适当的警告,因为它通常表明您的代码中存在缺陷。如果确实需要此行为,则可以使用以下代码解决它:
private void Test() => _ = Test1Async(); // CS4014 is not shown anymore
Run Code Online (Sandbox Code Playgroud)
将值分配给_是一个相对的新功能,指示有意忽略该值。
此代码不会引发CS4014:
private void Test() => Test2Async(); // CS4014 is not shown!
Run Code Online (Sandbox Code Playgroud)
当然,我可以重写所有方法以使用该async/await方法,但这会导致更多代码运行效率较低(由于async关键字生成的状态机)。也许我永远都不会忘记它,但是我的同事可能会再也不会得到触发器(或者我称之为不使用异步的第三方库)。
关于返回的任务使用情况的警告也有所不同。
有谁知道为什么对于Task不使用async关键字返回a的方法未生成此警告?
我创建了一个管理应用程序,它还允许快速访问远程计算机的远程桌面会话。我需要等到进程结束,这样我才能关闭到远程服务器的 VPN 连接。一切正常,除了等待进程结束。
以下代码用于启动 MSTSC 进程并等待它结束:
var process = new Process
{
StartInfo = new ProcessStartInfo("mstsc.exe"),
EnableRaisingEvents = true
};
process.Exited += (o, e) => Console.WriteLine("Process stopped.");
process.Start();
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)
该Exited事件几乎在程序启动后立即引发。当我mstsc.exe用notepad.exe一切替换时按预期工作。我认为 MSTSC 可能会自己分叉并中止初始过程。
但是可以使用以下命令(来自命令行)等待 MSTSC 结束:
start /wait mstsc.exe
Run Code Online (Sandbox Code Playgroud)
在我退出远程桌面会话之前,此命令不会返回。鉴于这些信息,我用这个替换了我的代码:
var process = new Process
{
StartInfo = new ProcessStartInfo("cmd.exe"),
Arguments = "/c start /wait mstsc.exe",
EnableRaisingEvents = true
};
process.Exited += (o, e) => Console.WriteLine("Process stopped.");
process.Start();
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)
这将运行 CMD.exe 并发出start /wait mstsc.exe …
我使用具有以下结构的库:
struct KeyValue1 {
key: Vec<u8>,
value: Vec<u8>,
}
fn get() -> Vec<KeyValue1> { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
我需要将此向量转换为具有以下结构的几乎相似的向量:
struct KeyValue2 {
key: Vec<u8>,
value: Vec<u8>,
}
Run Code Online (Sandbox Code Playgroud)
为了能够从一个向量转换为另一个向量,我目前使用以下代码:
let convertedItems = items.iter().map(|kv| -> KeyValue2{
key: key.clone(),
value: value.clone()
}).collect()
Run Code Online (Sandbox Code Playgroud)
虽然这有效,但它克隆了两个载体,效率很低。我不再需要原始items向量,因此我想将所有权从 转移KeyValue1到KeyValue2,但我还没有找到方法来做到这一点。
规则CA1008指定所有枚举都应该有一个0应该命名的值Unknown(我们在这里不讨论标志)。我理解您想要防止未初始化的值自动获得含义的原因。假设我定义了以下枚举:
enum Gender
{
Male,
Female
}
class Person
{
public string Name { get; set; }
public Gender Gender { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这指定了每个人都应该是男性或女性(让我们暂时忽略性别讨论)。如果我忘记设置Gender属性,则此人自动为男性,这可能会导致问题。出于这个原因,我理解 CA1008 警告,因此 0 值应该保留给未知/未初始化的值。
因此,让我们将Gender枚举更改为不再使用 0 值:
enum Gender
{
Male = 1,
Female = 2
}
Run Code Online (Sandbox Code Playgroud)
当我不指定性别时,那么这个人就不是男性或女性。序列化过程中可能会出现问题。该值0对于调试期间的枚举不是很具有描述性。为了修复它并避免 CA1008 警告,我再次更改枚举:
enum Gender
{
Unknown = 0,
Male = 1,
Female = 2
}
Run Code Online (Sandbox Code Playgroud)
未初始化的属性现在显示为Unknown看起来不错。但是我可能引入了另一个问题,那就是该Unknown值看起来像一个有效值并且可以应用于用户。我也可能会收到有关不处理所有枚举值的警告。假设,我使用的构造函数要求我指定性别和名称以避免未初始化的属性:
public Person(string name, Gender …Run Code Online (Sandbox Code Playgroud)