【发布时间】:2011-08-16 22:21:07
【问题描述】:
我正在尝试将特定类注入我的 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/ 作为网络范围部分的指导。我需要它,因为一些注入的对象应该只在请求期间存在。
现在,我有以下课程:
[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 并没有为我初始化这个类。我错过了什么吗?
编辑:
当我检查目录时 - 我看到我的课程已导出,但我没有看到它在任何地方导入...
编辑 2: 丹尼尔,谢谢。这说得通。在这一点上,它对我来说仍然有点像魔法。是的,WCF 创建了这个服务。比我有 MembershipProvider 和各种实用程序类都需要相同的导入。而且我没有创建这两个类,所以我不能让 Mef 创建它们。 (由 WCF 创建的服务,由 who-knows-what 创建的 MembershipProvider,实用程序类具有静态方法..)我想使用 Mef 而不是将我的东西存储在 HttpContext.Current 中。我的容器对象没有 SatisfyImports。它有 SatisfyImportsOnce。如果我在许多不同的构造函数中这样做怎么办? Mef 会共享同一个单例还是每次都会创建新实例?
此时我想知道我是否应该在这种特殊情况下使用 Mef..
【问题讨论】:
标签: c# wcf dependency-injection mef