在便携式区域进行呼叫/客户端组装

时间:2012-04-09 19:26:34

标签: c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-areas

我在可移植区域内执行了一个操作,需要获取有关调用它的Assembly的信息。便携式区域位于项目Core中,并由客户端应用Client引用。

GetAssemblyGetExecutingAssembly都返回Core汇编:

// Both are Core
assembly = Assembly.GetAssembly(GetType());
assembly = Assembly.GetExecutingAssembly();

我的下一个想法是使用GetCallingAssembly,但这会带回Anonymously Hosted DynamicMethods Assembly.

assembly = Assembly.GetCallingAssembly();

唯一的另一个选项是GetEntryAssembly,它只是null:

assembly = Assembly.GetEntryAssembly();

我想要做的是使用内置框架获取对Client程序集的引用。显然,我可以使用一些花哨的依赖注入或其他一些不太复杂的方法来获取这个动作的信息;但是,我想知道是否有更好的内置方法来做到这一点。

澄清:我想要的是客户端程序集的版本信息。我希望每个客户端都能访问位于VersionInfo区域的Core部分,并将构建版本信息添加到呈现的页面。因此,Core中的操作需要知道调用它的程序集,以便它可以反映出版本信息。

1 个答案:

答案 0 :(得分:0)

经过多次努力和许多眼泪,我已经确定DI将是最好的方法。为什么呢?

关于便携式区域的一些信息
经过一些研究和观察,似乎便携式区域在他们自己的MVC子实例中运行。我尝试从我的便携式区域调用部分视图存在于我的客户端应用程序视图中:

@Html.Action("Versions", "Core")

如果我在Version的{​​{1}}操作中提取堆栈跟踪,我会得到:

  

Core.Versions()
  在System.Web.Mvc ...
  在System.Web.Mvc ...
  在ASP._Page_Views_Shared_Layouts__Base_cshtml.Execute()
  在System.Web.Mvc ...   在......

由于我的客户端应用程序中的所有控制器代码都已执行,因此堆栈跟踪中甚至没有对该程序集的引用。我还尝试在Core操作中添加Assembly arg,la:

Versions

但结果是@Html.Action("Versions", "Core", new { assembly = Assembly.GetExecutingAssembly() }) ,显然是生成的程序集。

所以,真正唯一的选择是添加一个DI容器,该容器在每个客户端应用程序的Global.asax中使用执行程序集初始化,然后可以通过Core方法读取。