c# - 尝试使用 MEF 将依赖项注入(inject) IIS 托管的 WCF 服务

标签 c# wcf dependency-injection mef

我正在尝试将特定类注入(inject)到我的 WCF 服务中,但它不起作用,而且我不明白为什么。我对 MEF 和模式非常陌生,只是想让它发挥作用。观看了一系列视频以了解它是关于什么的,但是引导在我的情况下不起作用,因为它不是 Silverlight http://channel9.msdn.com/blogs/mtaulty/mef--silverlight-4-beta-part-1-introduction

这是我的 Web 应用程序的 Global.asax 代码。这不是 MVC,只是普通的 ASP.NET 应用程序:

private void Application_Start(object sender, EventArgs e)
        {
            RegisterRoutes();

            var catalog = new WebScopedCatalog(new DirectoryCatalog(Server.MapPath("~\\bin"))); 
            var container = new CompositionContainer(catalog);
            container.ComposeParts(this);
        }

首先,我不确定我是否正确地引导它。其次,我正在使用 http://www.timjroberts.com/2011/02/web-scoped-mef-parts/作为 web 范围部分的指南。我需要它,因为一些注入(inject)的对象应该只在请求期间存在。

现在,我有以下类(class):

    [Export(typeof(ITest))]
    [WebPartCreationPolicy(WebCreationPolicy.Session)]
    public class Test : ITest
    {
        public string TestMe()
        {
            return "Hello!";
        }
    }

我的服务看起来像:

[ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    public class MobileService
    {
        [Import]
        public ITest MyTestClass { get; set; }

        public MobileService()
        {
            int i = 10;
        }

当断点在 i=10 命中时 - 我的 MyTestClass 中有 NULL。显然,MEF 不会为我初始化此类。我错过了什么吗?

编辑:

当我检查目录时 - 我看到我的类已导出,但我没有看到它导入到任何地方...... enter image description here

编辑 2: 丹尼尔,谢谢。这说得通。在这一点上,它对我来说仍然感觉不太像魔法。是的,WCF 创建了这个服务。比我有 MembershipProvider 和各种实用程序类,它们都需要相同的导入。而且我没有创建这两个类,所以我不能让 Mef 创建它们。 (服务由 WCF 创建,MembershipProvider 由 who-knows-what 创建,实用程序类具有静态方法。)我想使用 Mef 而不是将我的东西存储在 HttpContext.Current 中。我的容器对象没有 SatisfyImports。它有 SatisfyImportsOnce。如果我在许多不同的构造函数中这样做怎么办? Mef 会共享同一个单例还是每次都会创建新实例?

此时我想知道我是否应该在这个特定场景中使用 Mef..

最佳答案

MEF 不会满足对它不创建的对象的导入。是什么创建了 MobileService?如果不是MEF,则默认不满足导入。即使它是 MEF,导入也不会在构造函数中得到满足 - 您不能在创建的对象上设置属性,直到它完成创建(即构造函数已完成)。

您可以调用 container.SatisfyImportsOnce(mobileService) 来满足部件的导入。您应该尽量避免在需要 MEF 导入的任何地方执行此操作。如果可以,您应该导出一个部件并从另一个部件导入它,以便 MEF 为您处理创建。但是,看起来这部分可能是由 WCF 创建的,因此您不能让 MEF 创建它,在这种情况下,使用 SatisfyImportsOnce 就可以了。

对 EDIT2 的响应:如果您每次都使用同一个容器,MEF 将默认只创建一个带有导出的部件实例。您可以将 CreationPolicy 设置为 NonShared(在导出或导入属性中)以更改此设置。

至于按照您尝试的方式使用 MEF 是否有意义,我对编写 Web 服务的了解还不够多,无法就此给您任何建议。

关于c# - 尝试使用 MEF 将依赖项注入(inject) IIS 托管的 WCF 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7085780/

相关文章:

c# - 教程 usercontrol with flipview/carousel on a timer XAML WinRT apps

c# - 为 Web API Controller 创建 MVC Controller 代理

c# - 统一公共(public)变量未与 gameObject.find 一起显示

c# - 如何在用 C# 编写的控制台应用程序中捕获来自工作线程的错误

.net - WebInvoke 属性可以被绑定(bind)配置替换吗

javascript - $routeProvider - 根据 URL 注入(inject) Controller 依赖

wcf - 带有 WCF 和持久队列的 RabbitMQ

c# - wcf service hosting on windows服务安装报错

ios - 如何将依赖项传递给 URL 协议(protocol)子类?

dependency-injection - 为什么 npm 安装的依赖项没有列在我的 package.json 文件中?