我正在尝试使用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) 无论如何都要访问当前主体,并且在请求使用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# 应用程序中使用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)