Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 使用MEF,web应用程序中的可扩展点是什么?_Asp.net Mvc_Design Patterns_Mef - Fatal编程技术网

Asp.net mvc 使用MEF,web应用程序中的可扩展点是什么?

Asp.net mvc 使用MEF,web应用程序中的可扩展点是什么?,asp.net-mvc,design-patterns,mef,Asp.net Mvc,Design Patterns,Mef,因此,我决定在我的新ASP.NET MVC web项目中使用Microsoft可扩展性框架(MEF)。该项目是一个非常典型的员工管理系统,有3个传统层:-表示层(带有视图和控制器),业务层(带有业务对象),当然还有数据访问层。经过一些研究,我读了很多书,说MEF应该帮助我们实现插件架构。这就是我被卡住的地方。我无法理解这个可插拔部分。我很确定,因为MEF是核心.NET框架的一部分,所以它并不局限于任何特定类型的应用程序,一般来说应该是有用的。我只需要从新的角度看待我的应用程序结构,这就是我需要一

因此,我决定在我的新ASP.NET MVC web项目中使用Microsoft可扩展性框架(MEF)。该项目是一个非常典型的员工管理系统,有3个传统层:-表示层(带有视图和控制器),业务层(带有业务对象),当然还有数据访问层。经过一些研究,我读了很多书,说MEF应该帮助我们实现插件架构。这就是我被卡住的地方。我无法理解这个可插拔部分。我很确定,因为MEF是核心.NET框架的一部分,所以它并不局限于任何特定类型的应用程序,一般来说应该是有用的。我只需要从新的角度看待我的应用程序结构,这就是我需要一些有用的见解的地方


由于我仍在尝试开始使用MEF,我的主要问题是;我的应用程序中主要的可扩展(可插拔)点是什么?使用MEF的compose方法通常应该组合哪些对象,以及使用MEF而不是传统方法进行组合的优点是什么?

MEF不会帮助您解决问题中描述的情况下的可扩展性问题,因为它似乎没有任何好处。对于这种特殊情况,MEF可以带来的是依赖注入。如果应用程序的开发方式是表示层依赖于业务抽象,而业务层依赖于数据访问抽象而不是具体实现,那么您将得到一个高度解耦的应用程序,该应用程序易于测试、维护和更改,而不会影响不必要的组件。有一种方法可以做到这一点:

假设您拥有对员工执行CRUD操作的数据访问类:

[Export(typeof(IEmployeeRepository))]
public class EmployeeRepository : IEmployeeRepository
{
    //Some logic here
}
正如您所看到的,
EmployeeRepository
类实现了
ieemployeerepository
接口,该接口增加了开发解耦应用程序所需的抽象级别。现在让我们假设在业务层中有一个类需要从
EmployeeRepository
类调用某些方法。要能够调用
EmployeeRepository
的方法,您需要它的一个实例。在不使用MEF(或任何其他国际奥委会框架)的情况下,这将是一种方法:

public class EmployeeManager
{
    private EmployeeRepository _employeeRepository;

    public EmployeeManager
    {
        _employeeRepository = new EmployeeRepository();
    } 
}
通过使用上面的代码示例,创建了
EmployeeManager
EmployeeRepository
类之间的硬依赖关系。在编写单元测试时,这种硬依赖关系很难分离,并导致
EmployeeRepository
类的任何更改直接影响
EmployeeManager
类对代码示例进行一点分解,并将MEF放入游戏中,您将得到以下结果:

[Export(typeof(IEmployeeManager))]
public class EmployeeManager : IEmployeeManager
{
    private IEmployeeRepository _employeeRepository;

    [ImportingConstructor]
    public EmployeeManager(IEmployeeRepository employeeRepository)
    {
        _employeeRepository = employeeRepository;
    } 
}
正如您所看到的,
EmployeeManager
类现在不依赖于
EmployeeRepository
类,而是依赖于
IEEmployeeRepository
接口,换句话说,它依赖于抽象。它本身并不创建
EmployeeRepository
类的实例。该任务留给MEF。现在它已经完成了需要明确的是,导出和导入构造函数属性是MEF的一部分,用于在运行时发现部分和解决依赖关系。使用最后一个代码示例,类是解耦的,易于测试和维护,您可以在
EmployeeRepository
类中更改内部逻辑,而无需执行
EmployeeRepositoryoyeeManager
class意识到了这一点。当然,他们之间的合同,
IEEmployeeRepository
必须得到维护

如上所述,还可用于将表示层与业务层分离。此外,上述内容也可通过使用任何其他IoC框架来实现,如Ninject、Autofac、StructureMap等。这些IoC框架与MEF之间的区别在于,如果使用它们,则需要在应用程序启动时配置哪个实例在遇到某些接口时创建:

//something like this, in the case of Ninject
this.Bind<IEmployeeRepository>().To<EmployeeRepository>();
//类似于Ninject的情况
this.Bind().To();

另一方面,MEF具有在运行时发现部件的能力。在应用程序启动时,您只需通知它在何处查找部件:目录、程序集、类型等。MEF的自动连线功能(在运行时发现部件的能力),使其超越常规的IoC框架。此功能使MEF非常适合开发可插拔和可扩展的应用程序,因为您可以在应用程序运行时添加插件。MEF可以加载插件并让应用程序使用它们。

这听起来像是在寻找问题的解决方案……如果您不想解决某个部分MEF有个小问题,那你为什么要尝试使用它呢?你买了一把闪亮的新锤子,正在乡间四处寻找一颗钉子?1)现在,我只想了解一下MEF背后的概念,这样以后我就可以放心地使用它了。2) 这样我就可以为战争做好准备,在那里我必须使用我闪亮的新锤子。@Clan先生,对我的回答有什么评论吗?这有帮助还是不是你所期望的?嗯,不是真的阻碍。。。如果您检查答案中的灰色元素(用`(backticks)包装的元素),您将看到它们是
标记。MEF、依赖项注入、IoC、导出、Ninject、Autofac、StructureMap、目录、程序集和类型不是代码您是对的。我一直在使用反勾号来突出显示,但它应该用于内联代码。是的。如果你一定要强调某件事。使用粗体:)@IlijaDimov谢谢你的回复。您能提供一些应用程序中可扩展点的实际示例吗?@mrcommerce architecture()。它是一个可插拔的电子商务系统。您应该了解实现可插拔体系结构意味着什么。如何使用MEF和ASP.NET MVC实现可插拔体系结构?请查看以下链接:。