- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试将 Microsoft Extensibility Framework (MEF) 实现到基于 MVC 的示例 Web 应用程序中。我在 MEF Overview 上使用 SimpleCalculator 示例解决方案页。我的目标是一个可以从另一个项目动态加载 DLL 扩展以扩展模型功能的应用程序,本质上我希望 MVC 应用程序成为其他扩展插件的框架。首先是我的设置:
项目 1(MVC 应用程序、MEF 组件宿主):
我按如下方式装饰模型中的元素:
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
namespace ExpressionParserPOC.Models
{
public class ExpressionModel
{
private CompositionContainer _container;
[ImportMany]
IEnumerable<Lazy<IExtensions,IExtensionName>> extensions { get; set; }
public ExpressionModel()
{
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new DirectoryCatalog("C:\\local_visual_studio\\ExpressionParserPOC\\ExpressionParserPOC\\Extensions"));
//Create the CompositionContainer with the parts in the catalog
_container = new CompositionContainer(catalog);
_container.ComposeParts(_container);
//TEST: Can we access the extensions?
if (extensions != null)//<--NULL WHEN CONSTRUCTOR IS CALLED WHY? Expected GetMatrix() Function from DLL to be exposed
{
foreach (Lazy<IExtensions, IExtensionName> i in extensions)
{
Lazy<IExtensions, IExtensionName> foo = i;
}
}
}
}
public interface IExtensions
{
double[][] GetMatrix(string matrix);
}
public interface IExtensionName
{
Char Symbol { get; }
}
}
现在为了测试,我只是从 Controller 调用模型的构造函数:
namespace ExpressionParserPOC.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.Message = "Enter an Expression for Octave to evaluate";
//Instantiate an ExpressionModel composed of extensible parts
var model = new ExpressionModel();
return View(model);
}
}
}
项目 2(DLL 项目,MEF 组件):
//PROJECT BUILD OUTPUTS TO THE EXTENSIONS DIRECTORY IN PROJECT 1 ABOVE
using System.ComponentModel.Composition;
namespace MyExtensions
{
//Project 1 already added as a reference
[Export(typeof(ExpressionParserPOC.Models.IExtensions))]
[ExportMetadata("Symbol", 'o')]
public class Octave : MyExtensions.IExtensions
{
//Other class properties, constructors, functions, etc.
#region FUNCTIONS
public double[][] GetMatrix(string matrix)
{
double[][] mat = new double[][];
//Do Stuff
return mat;
}
#endregion
}
public interface IExtensions : ExpressionParserPOC.Models.IExtensions
{
}
}
问题是,当我从同一项目中的 Controller 调用模型构造函数时,主机 MVC 应用程序项目中的扩展列表永远不会被填充。我是 MEF 开发的新手,不确定自己做错了什么,因为我正在使用 MVC 应用程序,所以我需要考虑一些额外的事情吗?为什么 Project 1 扩展列表不会被填充?我的接口(interface)定义错了吗?示例计算器应用程序是一个简单的命令行项目,似乎工作正常,我看到的唯一区别是外部 DLL 项目位于相同的解决方案空间中,而对于我的示例,解决方案空间是独立的。
最佳答案
ExpressionModel
构造函数中的一个小错误。您正在编写容器本身:)
_container.ComposeParts(_container);
问题应该立即显现出来,因为如果 ExpressionModel
的组合确实发生过,即使没有发现任何扩展,extensions
属性也会被初始化为 0项目,但它不会是 null
。
您需要像这样组合当前模型实例:
_container.ComposeParts(this);
其他一切似乎都没有问题,并且在此更正后应该可以正常工作。
关于c# - 难倒在 MVC MEF 应用程序上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13039011/
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 Improve th
所以我正在开发一个黑 jack 程序,但我有点卡住了。我会警告大家,我对编程真的很陌生,而且,我正在项目中期......所以有一些松散的结局和未使用的变量,以及一些不必要的逻辑(用于测试),但这就是我
我正在尝试创建一个可用作 OpenGL 测试工具的示例程序。到目前为止,我的那个似乎可以工作,但似乎忽略了通过统一变量 MVPMatrix 传递的 MVP 矩阵。当我添加代码以读回制服并检查它是否确实
感谢您帮助我,这是有关我的代码的部分。 printf("Thank you, now please enter the logic gate"); scanf("%s", &C); if (C ==
public static void ejemplosString(String palabra){ char[] letras = palabra.toCharArray();
所以,我有一个 php 应用程序,通过 cgi 和 nginx 运行。我有一个 .jar 程序,用于在条形码打印机(Zebra)上打印条形码,猜猜看是什么!。 我的 php 应用程序使用 exec()
我遇到的唯一问题是 getAll() 方法,它似乎在 PersonnelController 类中的位置立即运行。我也曾在其他很多地方尝试过,但都没有成功。 setAll() 方法看起来不错,我已经测
我是一名优秀的程序员,十分优秀!