在 ServiceStack 服务中使用 MEF

Use MEF in ServiceStack services

我正在尝试将 MEF 用作 ServiceStack (https://github.com/ServiceStack/ServiceStack/wiki/The-IoC-container) 中的 ContainerAdapter。

我制作了 ContainerAdapter:

internal class MefIocAdapter : IContainerAdapter
{
    private readonly CompositionContainer _container;

    internal MefIocAdapter(CompositionContainer container)
    {
        _container = container;
    }

    public T TryResolve<T>()
    {
        return _container.GetExportedValue<T>();
    }

    public T Resolve<T>()
    {
        return _container.GetExportedValueOrDefault<T>();
    }
}

并像这样注册:

    public override void Configure(Container container)
    {
        container.Adapter = new MefIocAdapter(_mefContainer);
    }

通过 RegisterService(System.Type, String) 函数注册服务后,我收到 MEF 的异常。找不到出口:

ContractName    ServiceStack.Auth.IAuthSession
RequiredTypeIdentity    ServiceStack.Auth.IAuthSession

我是不是误会了什么?

为什么Funq要求适配器容器解析内部ServiceStack的依赖?

funq 会使用 MEF 实例化我的服务吗? (如果没有,有服务工厂之类的吗?)

P.S。当我删除 container.Adapter 赋值时它起作用了(但我的 MEF 依赖项为空)。

当您注册容器适配器时,您告诉 ServiceStack 解决适配器的所有依赖关系,如果首先在您的适配器中找不到依赖关系,它只会搜索 ServiceStack 的 IOC .

这里的问题是 IAuthSession 是一个可选的 属性 依赖项,您的适配器应该 return null 如果该依赖项不存在,那么 ServiceStack 可以检查Funq 中的依赖项。

在您的适配器中,您弄错了 Resolve<T>(用于解析构造函数依赖项)return 的默认值,TryResolve<T> 抛出异常当它应该 return 默认值时不存在。所以我会将您的适配器实现更改为:

public T TryResolve<T>()
{
    return _container.GetExportedValueOrDefault<T>();
}

public T Resolve<T>()
{
    return _container.GetExportedValue<T>();
}