小编Ste*_*doo的帖子

Angular 2 angular-cli AOT在模块中声明抽象类?

我正在尝试使用angular-cli进行AOT编译设置.我有一个从抽象类继承的指令,我在编译期间遇到一个错误,即angular无法确定抽象类属于哪个模块.我无法将它添加到NgModule的声明数组中,那么正确的方法是什么呢?我的代码结构如下所示,

//...imports
export abstract class TutorialDirective  {
    //...base class logic
}

@Directive({
    selector: '[tut]',
    exportAs: 'tut'
})
export class DefaultTutorialDirective extends TutorialDirective {
    //...calls into the base class for some shared stuff.
}
Run Code Online (Sandbox Code Playgroud)

错误看起来像这样

ERROR in Cannot determine the module for class TutorialDirective in /test-app/src/app/tutorial/directive/tutorial.directive.ts!
Run Code Online (Sandbox Code Playgroud)

我的AppModule:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';

import { AppComponent } from './app.component';

import { TutorialService } …
Run Code Online (Sandbox Code Playgroud)

angular-cli angular

18
推荐指数
2
解决办法
4608
查看次数

Simple Injector使用OWIN在WebAPI中获取当前主体

无论如何都要访问当前主体,并且在请求使用Simple Injector进入控制器之前?我正在使用OWIN和Asp.net身份.

我有一个DbContext,我注入到我的控制器中,但是这个上下文将根据经过身份验证的用户获取它的连接字符串.这是我到目前为止,

container.RegisterWebApiRequest<TenantDbContext>();
container.RegisterWebApiRequest<ITenantConnectionStringProvider>(() => new TenantConnectionStringProvider(container));
Run Code Online (Sandbox Code Playgroud)

然后在我的TenantConnectionStringProvider中我有这个,

var request = container.GetCurrentHttpRequestMessage();
var principal = request.GetRequestContext().Principal as ClaimsPrincipal;
Run Code Online (Sandbox Code Playgroud)

但校长没有索赔.我意识到声明仅在控制器创建后才可用.这是否意味着它是不可能的,因为这一步是在创建控制器之前进行的?

编辑:这基本上是代码的其余部分:

WebApi控制器

    public CampaignsController(TenantDbContext context, ILog log)
    {
        this.campaignService = campaignService;
        this.log = log;
    }
Run Code Online (Sandbox Code Playgroud)

租户上下文(仅从EF的DbContext继承):

    public TenantDbContext(ITenantConnectionStringProvider provider)
        : base(provider.GetConnectionString())
    {
    }
Run Code Online (Sandbox Code Playgroud)

在搞砸了一下后,我能够做到这一点,但感觉非常hacky ..我添加了一个在验证后发生的OWIN中间件.我不知道为什么,但我在这里有所有经过身份验证的用户信息,但是当它转到TenantConnectionStringProvider时,HttpRequestMessage上没有这些信息.

        app.Use(async (context, next) =>
        {
            using (container.BeginExecutionContextScope())
            {
                CallContext.LogicalSetData("Claims", context.Authentication.User.Claims);
                var request = (OwinRequest)context.Request;
                await next();
            }
        });
Run Code Online (Sandbox Code Playgroud)

然后在我的TenantConnectionStringProvider中,我就这样做了,

    public string GetConnectionString()
    {
        var context = (IEnumerable<Claim>)CallContext.LogicalGetData("Claims");
        return "test";//get claim from context to get the …
Run Code Online (Sandbox Code Playgroud)

c# asp.net simple-injector asp.net-web-api owin

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

.NET Disruptor 异步模式

我在 C# 应用程序中使用Disruptor-net 。我在理解如何在干扰器模式中执行异步操作时遇到一些困难。

假设我有一些事件处理程序,并且链中的最后一个将消息传递给我的业务逻辑处理器,那么我如何处理业务逻辑处理器内部的异步操作?当我的业务逻辑需要进行一些数据库插入时,它是否会将消息传递给我的输出中断器,由它进行插入,然后在我的输入中断器上发布一条新消息,其中包含所有状态以继续事务?

此外,在我的输出干扰器中,我会使用任务吗?我 99.9% 确定我想要使用任务,这样我就不会遇到大量阻塞异步操作的事件处理程序。那么,这与颠覆者模式有何契合呢?在我的 EventHandler 中做这样的事情似乎有点奇怪。

void OnEvent(MyEvent evt, long sequence, bool endOfBatch)
{
    db.InsertAsync(evt).ContinueWith(task => inputDisruptor.Publish(task));
}
Run Code Online (Sandbox Code Playgroud)

c# asynchronous disruptor-pattern

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