我正在尝试创建一个可以使用插件扩展的基础MVC4应用程序,以便应用程序的未来开发人员不必弄乱其源代码。 扩展范围从(部分)视图到数据访问和api控制器。
目标是开发人员必须能够创建单独的插件项目,构建项目,然后将相应的文件放入插件文件夹,而无需重建基础应用程序。 插件文件夹将存储在应用程序的根目录中,并包含每个插件的文件夹,即; web.presentation.statistics.chart1 和 web.api.products.failrate
我看了几个主题,比如; MEF,OSGi.NET,MVC领域,mvccontrib等以及许多文章和博客,但它们都已过时或不符合我的要求。
nopCommerce plug-ins are written的方式非常有趣,但我必须承认源代码对于像我这样的人来说太复杂了,对所有与插件相关的开发都是新手。
我希望你能引导我朝着正确的方向前进,并可能指出一些可以帮助我的技术或框架。 非常感激。
答案 0 :(得分:1)
您可以查看依赖注入(DI)以允许您交换特定接口的实现。例如,如果您有IVehicle
,则可以注入Car
,Truck
或Bus
具体实例。大多数DI框架将允许您配置规则注入不同的实例。
关于API控制器,我已经设置了继承的Web API控制器。效果很好。这就是我在做的事情......
添加一个允许从子类中读取[Route]
属性的提供程序:
public class InheritedAttributeRouteProvider : DefaultDirectRouteProvider
{
protected override IReadOnlyList<IDirectRouteFactory> GetActionRouteFactories(System.Web.Http.Controllers.HttpActionDescriptor actionDescriptor)
{
return actionDescriptor.GetCustomAttributes<IDirectRouteFactory>(inherit: true);
}
}
设置HttpConfiguration
以使用此提供商:
HttpConfiguration config = new HttpConfiguration();
config.MapHttpAttributeRoutes(new InheritedAttributeRouteProvider());
创建一个基本控制器:
public abstract class ControllerBase : ApiController
{
[Route]
public IHttpActionResult Get()
{
return this.Ok(this.GetType().FullName);
}
}
创建一个具体的控制器:
[RoutePrefix("foo")]
public class ConcreteController : ControllerBase
{
}
(请注意,具体控制器具有[RoutePrefix]
。)
希望这有帮助!