小编And*_*ewP的帖子

将ApplicationUser和其他模型移出MVC项目

如何从默认的ASP.Net Mvc/Identity 2.0中拆分属性,功能和类?我正在与一些事情作斗争:

  • 默认情况下,它希望使用OWIN的上下文来连接某种依赖注入,并控制Managers
  • 它将ApplicationDbContext放在应用程序级别,我的架构要求它在"较低"级别可用.
  • 它要求我声明与作用于这些属性的功能相同的类中的任何属性(不适合我的架构)
  • ApplcationUser模型依赖于Asp.Net,如果我要将POCO移动到解决方案的非MVC层,我想打破它

应用架构:

我有一个有几层的解决方案:

  • Api - 定义服务的接口
  • 域 - 存储代表业务域的POCO模型
  • 业务 - 存储用于与域对象交互并消耗服务的逻辑
  • 服务 - 服务的实现,包括实体框架,以及域对象的结构映射
  • 应用程序 - 在这种情况下,是一个MVC应用程序.

我的业务层只知道服务接口,而不是实现,我使用依赖注入来连接所有东西.

我有一些接口定义数据服务的读/写/工作单元操作,以及从DbContext(在我的服务层)继承的这些接口的实现.DbSet<MyPoco> MyPocos {get;set;}我通过传递一系列定义关系的类型配置,然后通过访问我的类型,而不是一系列的连接Set<Type>().一切都很好.

此堆栈已用于现有应用程序,并且运行良好.我知道它将转换到MVC应用程序,并且只有"开箱即用"ASP.Net Identity-2的问题.

architecture asp.net-mvc asp.net-identity-2

7
推荐指数
1
解决办法
1233
查看次数

如何防止Azure webjob同时多次处理相同的消息

我有一个Azure WebJob项目,我在我的开发机器上本地运行.它正在侦听Azure Service Bus消息队列.什么都没有像主题,只是最基本的消息队列.

它多次接收/处理相同的消息,在收到消息时立即启动两次,然后在处理消息时间歇性地启动.

问题:

  • 为什么我立即多次收到同样的信息?它似乎是在应用PeekLock之前重新获取的?
  • 为什么即使它仍在处理中,该消息又被重新接收?我可以设置PeekLock持续时间,或以某种方式锁定消息只处理一次
  • 如何确保队列中的每条消息只处理一次?
  • 我希望能够一次处理多个消息,多次不同的消息,所以将MaxConcurrentCalls设置为1似乎不是我的答案,或者我误解了该属性?

我正在使用异步函数,简单的注入器和自定义JobActivator,因此我的函数签名是:而不是静态void方法:

public async Task ProcessQueueMessage([ServiceBusTrigger("AnyQueue")] MediaEncoderQueueItem message, TextWriter log) {...}
Run Code Online (Sandbox Code Playgroud)

在工作中,它正在移动blob服务上的一些文件,并从媒体服务调用(和等待)媒体编码器.因此,虽然Web作业本身没有进行大量处理,但是需要相当长的时间(对于某些文件,这需要15分钟).

该应用程序正在启动,当我向队列发布消息时,它会响应.但是,一旦收到消息,它就会多次收到消息:

Executing: 'Functions.ProcessQueueMessage' - Reason: 'New ServiceBus message detected on 'MyQueue'.'
Executing: 'Functions.ProcessQueueMessage' - Reason: 'New ServiceBus message detected on 'MyQueue'.'
Run Code Online (Sandbox Code Playgroud)

此外,当任务正在运行时(我看到媒体服务功能的输出),它将从队列中获得另一个"副本".

最后,在任务完成后,它仍然间歇性地处理相同的消息.

azure azureservicebus azure-webjobs azure-webjobssdk

7
推荐指数
1
解决办法
1925
查看次数

Resolver 或 Guard - 哪个更适合使用 ngrx 获取数据

使用 Angular 和 ngrx,我想导航到路线并确保 ngrx/store 中提供所需的数据。我正在使用 ngrx/store action/effect/reducer 来物理调用 API。路由正在加载的组件通过存储访问数据,因为系统的其他部分可能会更新数据。

如果数据加载失败,则会调度 LOAD_FAILED 操作,可以通过多种方式处理该操作。

我应该使用守卫还是解析器?每种方法还有哪些其他优点和缺点?你尝试过什么,如果有机会再给你一次,你还会这样做吗?以下是我的一些想法。

选项一:守卫

当访问路由时,guard 的 canActivate 检查数据是否在 store 中,如果没有,则从 API 加载数据,并将其添加到 store 中。如果数据加载失败,canActivate 将返回 false(作为可观察值)。

这种方法的缺点是“加载数据不应该是警卫的责任”,但优点是如果无法加载数据,则可以阻止访问,并且路由器可以处理“未找到”的情况,两者都是都在职责范围内。

选项 2:旋转变压器

当访问该路线并且任何其他防护已允许激活时,解析器将被调用。该解析器检查数据是否在存储中,如果没有,则触发 LOAD 操作,以从 API 加载并添加到存储中。然后,一旦加载了数据,解析器就会返回一些任意数据,当组件使用存储时,这些数据会被路由/组件丢弃。如果数据加载失败,某些内容会重定向到未找到的页面

这种方法的缺点是解析器没有以传统的方式使用,例如它返回的数据被丢弃。此外,解析器在未找到时需要重定向到 404,或者 LOAD_FAILED 需要重定向。这增加了复杂性,因为有时 LOAD_FAILED 可能不应该重定向,例如当后台操作触发加载时。从好的方面来说,解析器负责加载数据。

ngrx angular ngrx-store

7
推荐指数
1
解决办法
4075
查看次数

location.hash 和 history.replaceState

我有绑定到 window.hashchange 的问题。调用 时history.replaceState,它会触发 'hashchange' 事件,除非调用了location.hash。我使用 Chrome 42 和 jQuery 来协助绑定。我已经加载了 Sammy.js(我实际上正在尝试弄清楚 Sammy 将如何解释该行为)

我正在控制台中调试,并执行以下操作:

$(window).bind('hashchange', function(e) { alert('# change' + location.hash); });

history.replaceState({}, "", "#2")-->显示警报

location.hash = "3" --> 显示警报

history.replaceState({}, "", "#4")-->不显示警报

这是一个错误,还是预期的行为?我会认为 replaceState 要么总是,要么从未触发 'hashchange' 事件

html javascript pushstate html5-history

3
推荐指数
2
解决办法
4219
查看次数

将依赖项注入实体框架实体和项目

有没有办法将依赖项注入从EF Linq context.Entities.Select(x => new Y {...})投影返回的对象?(我使用的是Simple Injector,但概念仍然存在)

我试图实现的一些事情:(这只是输入,没有编译,抱歉任何语法错误/不完整)

// person MAY be an entity, but probably more likely a class to serve a purpose
public class Person {
  public string Name
  public DateTime DOB {get;set; }

  // what I want to achieve: note, I don't want to have complex logic in my model, I want to pass this out to a Service to determine.. obviously this example is over simplified...
  // this could be a method or a …
Run Code Online (Sandbox Code Playgroud)

c# linq entity-framework dependency-injection simple-injector

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