小编Ian*_*tes的帖子

适用于SignalR和Castle Windsor的Hub依赖生命周期管理

我有一些SignalR集线器可能需要访问一些瞬态和单独的依赖项.挂起Hub的创建很容易并且工作正常但是SignalR在创建的Hub上执行自己的Dispose()调用,而不是通知依赖解析器并让它参与处理.

如果依赖项是注册单例,这不是什么大问题,但如果它们被注册为瞬态,那么它们将永远不会被处置(如果需要的话)并且Windsor将保持它们存活直到收集Windsor容器(当无论如何,Web服务器正在关闭).

我看到几种可能的处理方法......

a)这里有人指出了一种方法来将SignalR的HubDispatcher类子类化,以便它可以进行适当的处​​理.它不是SignalR的标准DependencyResolver的一部分,所以这可能很难/不可能

b)管道中其他地方的SignalR中的其他一些类可以被覆盖或轻松替换,以便我们可以继承HubDispatcher并确保使用子类.据我所知,这将是Owin中间件类HubDispatcherMiddleware.有没有办法迫使Owin不注册这个类,而是注册我自己的版本(这又使用我自己的HubDispatcher)?

c)有一种方法可以拦截SignalR在我的Hub类上进行的Dispose()调用,这样就可以调用Windsor来确保任何依赖关系被正确处理并从容器中释放

d)谨慎地避免使用瞬态生活方式依赖项,而是传入类型化工厂,以便我们可以通过Hub中的类型化工厂解决和释放每个依赖项

目前(d)是我知道该怎么做的唯一一个.(a)或(b)会很棒.(c)主要由本文http://kozmic.net/2010/01/27/transparently-releasing-components-in-windsor/涵盖,但是,拦截器要求通过IDisposable调用Dispose().SignalR的HubDispather类实现了集线器处理

private static void DisposeHubs(IEnumerable<IHub> hubs)
{
    foreach (var hub in hubs)
    {
        hub.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

没有转换到IDisposable那里...... Hub类上的Dispose()是虚拟的,而且博客帖子暗示虚拟Dispose()可能会增加一些复杂性(我不太确定多少,我不太了解无论如何,Castle的拦截器以及是否可以使用IDisposable进行处理.

我很欣赏我已经为一个相当狭隘的观众写了这个问题 - 那些使用过Windsor和SignalR而不仅仅是解决依赖关系的人.我发现的每个例子,包括StackOverflow上的例子,似乎都忽略了依赖关系的发布.

谢谢!

castle-windsor inversion-of-control signalr signalr-hub

36
推荐指数
1
解决办法
2952
查看次数

ASP.NET WebAPI OData - 继承自EntitySetController <>但使用Get(ODataQueryOptions选项)而不是[Queryable] Get()

我正在使用ASP.Net WebAPI每晚构建(2013-01-16)以获得最新的OData支持.

正如MSDN OData 0.2.0-alpha发布帖上Meta-Me博客所说,现在EntitySetController<T>可以从中派生OData控制器来消除很多痛苦和管道代码.

EntitySetController<T>类实现获取()作为

[Queryable]
public virtual IQueryable<TEntity> Get()
{
    throw EntitySetControllerHelpers.GetNotImplementedResponse(Request);
}
Run Code Online (Sandbox Code Playgroud)

我想利用Get(ODataQueryOptions options)ASP.Net Web API OData支持提供的更具体的方法.

我把它编码为

public IEnumerable<Patient> Get(ODataQueryOptions options)
{
    IQueryable patients = entities.Patients;

    if (options.Filter != null)
    {
        patients = options.Filter.ApplyTo(patients, new ODataQuerySettings());
    }

    return (patients as IQueryable<Patient>).AsEnumerable();
}
Run Code Online (Sandbox Code Playgroud)

(我也有这个返回IQueryable <>并看到其他人谈论ODataResult - 这是我目前无法发现的类型).

但是,如果我尝试在自己的控制器中使用基于ODataQueryOptions的Get方法,则会收到有关与请求匹配的多个操作的错误消息.特别是那个错误

Multiple actions were found that match the request: 

System.Collections.Generic.IEnumerable`1[Dox.Server.Model.Patient] Get(System.Web.Http.OData.Query.ODataQueryOptions) on type Dox.Server.Web.Controllers.PatientController

System.Linq.IQueryable`1[Dox.Server.Model.Patient] Get() on type System.Web.Http.OData.EntitySetController`2[[Dox.Server.Model.Patient, Dox.Server.Model, …
Run Code Online (Sandbox Code Playgroud)

odata asp.net-web-api

6
推荐指数
1
解决办法
5023
查看次数

在ASP.NET WebAPI OData中返回子元素

我正在使用最新的ASP.Net WebAPI Nightly版本(日期为2013-01-16).

我有一个简单的EF数据库第一个模型,目前有两个实体 - 患者和访问.每位患者可以多次访问.

我希望能够查询我的患者列表,并让每位患者的访问实体在线返回.我知道WebAPI的OData实现还不支持$ expand.我希望这只意味着不支持可选的客户端控制扩展,并且我可以强制扩展服务器端.

目前我没有进行任何内联访问.

例如,我的PatientController的()Get()方法看起来像

[Queryable(AllowedQueryOptions=AllowedQueryOptions.Supported)]
public override IQueryable<Patient> Get()
{
    var query = this.entities.Patients.Include("Visits");
    return query;  
}
Run Code Online (Sandbox Code Playgroud)

我已经验证了针对我的数据库执行的查询确实包含访问信息.

要使用公开的OData服务作为示例,如果您使用http://services.odata.org/OData/OData.svc/上的服务,则可以获得供应商列表.这是http:// http://services.odata.org/OData/OData.svc/Suppliers.您还可以使用http:// http://services.odata.org/OData/OData.svc/Suppliers索取包含产品列表的供应商列表?$ expand = Products

单步执行ASP.NET代码(通过符号服务器)我已经到了System.Web.Http.OData.Formatter.Serialization.ODataEntityTypeSerializer,可以看到它是CreatePropertyBag方法,它构建了要序列化的属性列表,只是不包括导航属性,除了被写为NavigationLinks之外,它们似乎在其他任何地方都没有被枚举.

我对ASP.NET世界一般都很陌生,并花了一周左右的时间了解事情的发展方向(特别是2012年底对OData所做的更改以及2013年迄今为止的进一步更改) .

我怀疑如果要修改ODataEntityTypeSerializer(我很乐意尝试)将这些额外的信息嵌入到适当的位置(在每个导航链接中作为嵌套的内联Feed尽可能地告诉我),那么我将被设置.

问题:

  1. 我是否忽略了一些明显的东西,我可以设置一个标志来打开这种行为?我可以看到为什么,如果这样的标志存在,它将默认关闭(EF延迟加载,这个标志不会很好)

  2. 如果#1不是,我可以使用其他一些ODataEntityTypeSerializer吗?如果是这样,我该如何切换到它?

  3. 如果#2不是,那么我应该开始编写自己的指针?有没有我可以在自己的序列化程序中替换的地方,或者我必须维护自己的ASP.NET扩展项目的分支(而不是运行时项目)

非常感谢!

odata asp.net-web-api

5
推荐指数
1
解决办法
4428
查看次数