1

MEF を使用して SignalR の DependencyResolver を作成しようとしています。これまでのところ、私は次のものを持っています:

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 には、2 番目に発生するものとして次のものがあります。最初は MEF コンテナーの作成です。

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

私も試しました:

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

同じ結果で。

ここで明らかな何かが欠けていますか?私が見つけたすべてのサンプルは他のコンテナー用であり、より複雑に見えます。

ありがとう

4

2 に答える 2

2

ここでの問題は、「Concat()」の使用にあるようです。呼び出されたコレクションを変更するのではなく、新しいコレクションを返します。

于 2012-12-19T07:30:16.263 に答える
1

Linq-to-objects 演算子 (Concat はその 1 つです) には副作用がありcreatedObjects.Concat(exports.Select(x => x.Value));ません。つまり、連結を行うと、createdObjects で連結が行われず、代わりに、の結果を列挙することにしたときに連結が行われますConcat。を返す他のほとんどすべての Linq 演算子と同様に、これは遅延演算子ですIEnumerable<T>実行方法による標準クエリ演算子の分類を見てください。

コードを機能させるには、次のことを試してください。

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);
}

DefaultDependencyResolverは null を返す可能性があるbase.GetServicesため、 の戻り値を確認する必要があります。 GetServices

あとは、結果を列挙するだけですGetServices

于 2012-12-19T09:00:36.253 に答える