2012-12-13 43 views
1

我想为使用MEF的SignalR创建一个DependencyResolver。到目前为止,我有以下几点:SignalR和MEF

public class SignalRMefDependencyResolver : DefaultDependencyResolver 
{ 
    private readonly CompositionContainer _container; 

    public SignalRMefDependencyResolver(CompositionContainer container) 
    { 
     _container = container; 
    } 

    public override object GetService(Type serviceType) 
    { 
     var export = _container.GetExports(serviceType, null, null).SingleOrDefault(); 

     return null != export ? export.Value : base.GetService(serviceType); 
    } 

    public override IEnumerable<object> GetServices(Type serviceType) 
    { 
     var exports = _container.GetExports(serviceType, null, null); 
     var createdObjects = new List<object>(); 

     if (exports.Any()) 
     { 
      createdObjects.Concat(exports.Select(x => x.Value)); 
     } 

     createdObjects.Concat(base.GetServices(serviceType)); 
     return createdObjects; 
    } 
} 

我觉得GetService的是工作,但GetServices未能找到IHubDescriptorProvider和IMethodDescriptorProvider出口 - 无论是在MEF或基地。

在我的Application_Start我有以下为发生第二件事 - 第一个是创建MEF容器:

 RouteTable.Routes.MapHubs(new SignalRMefDependencyResolver(MefConfig.Container)); 

我也试过:

  GlobalHost.DependencyResolver = new SignalRMefDependencyResolver(MefConfig.Container); 
     RouteTable.Routes.MapHubs(); 

与同结果。

我在这里错过了一些明显的东西吗?我发现的所有样品都用于其他容器,看起来更复杂。

感谢

+0

你怎么知道它不工作?它如何失败? – Pete

+0

合乎逻辑的问题:)当我遍历解析器时,它将为这两个接口返回null。另外,当我尝试从客户端启动集线器时,我的集线器未被创建。 – Jonesie

+0

您确定这些对象在您的MEF容器中吗?什么是你的MEF设置? (你有什么设置[导入]和[导出]的东西?) – Pete

回答

2

看起来像这里的问题是你使用“CONCAT()” - 它返回一个新的集合,而不是改变它呼吁集合。

1

Linq-to-objects操作符(Concat就是其中之一)是无副作用的,这意味着当你做createdObjects.Concat(exports.Select(x => x.Value));时,连接不会发生在createdObjects上,而会发生在你决定枚举Concat的结果。它几乎是所有返回IEnumerable<T>的其他Linq运营商的延期运营商。看看classification of Standard Query Operators by manner of execution

现在为您的代码的工作,请尝试以下操作:

public override IEnumerable<object> GetServices(Type serviceType) 
{ 
    var mefExports = _container.GetExports(serviceType, null, null); 

    //We need this because 
    var dependencyResolverServices = base.GetServices(serviceType); 
    if (dependencyResolverServices == null) 
    { 
     dependencyResolverServices = Enumerable.Empty<object>(); 
    } 

    return mefExports.Select(x => x.Value).Concat(dependencyResolverServices); 
} 

您需要检查的base.GetServices的返回值,因为DefaultDependencyResolver'sGetServices可以返回null。

然后你所要做的就是列举你的GetServices的结果。