小编Ton*_*oni的帖子

组合ASP.NET MVC Web应用程序(MEF,区域,DI)的最佳实践

我目前正在研究如何重构现有的非模块化ASP.NET MVC 3.0应用程序的体系结构.我有一个类似于插件的插件,以使现有项目可扩展.

我已经搜索了制作模块化Web应用程序的不同策略,并发现了以下内容.我希望你对这些想法发表评论.

  • 单独项目中的MVC区域

对于每个插件,我想创建一个单独的ASP.NET MVC项目,其中包含插件的控制器,视图和视图模型."员工"模块将包含用于列出,创建,更新和删除员工的区域.但是听起来不错,AreaRegistration需要将所有区域放在"bin"目录中.我找到了一种方法将Area项目直接放在Areas文件夹中,并从"/ Areas/[AreaName]/bin"文件夹中解析Area程序集:

BuildManager.AddReferencedAssembly.Add(Assembly.LoadFrom(…));
AppDomain.CurrentDomain.AssemblyResolve += ResolveAssemblies;
Run Code Online (Sandbox Code Playgroud)

这工作得很好,允许我在主项目的Areas文件夹中部署插件.我喜欢我使用ASP.NET MVC开箱即用的区​​域功能.

  • MVC便携式区域(MVCContrib)

http://elegantcode.com/2012/04/06/mvc-portable-areas/

便携式区域似乎不是一种好方法,因为它们要求将视图编译为Area项目文件中的嵌入资源.这将阻止IIS缓存.另一方面,我真的无法想象性能缺点究竟有多大.

  • 使用MEF的基于MVC的模块

http://www.fidelitydesign.net/?p=104

为了在其他项目中创建松散耦合的服务,我非常依赖MEF.因此我认为使用它来发现ASP.NET MVC模块/插件是个好主意.我最终会使用一个ControllerFactory来实例化使用'Export'属性导出的控制器.这样我就可以完全控制插件实例化,并可以使用MEF来获取服务.然而,使用MEF确实需要比使用MVC区域更多的工作,MVC区域解决了开箱即用的控制器.

  • 插件项目中的实体框架

到目前为止,我无法解决的一个问题是如何在各个插件项目中分发实体.目前,我们使用Database First方法,该方法由一个包含所有实体的*.edmx模型文件组成.即使使用DbContext或Code First,也不可能为一个数据库使用多个DbContext类.一种想法是使用MEF将来自不同插件的实体加载到中央DbContext类中.但是我不知道这是否是支持和/或推荐的设置.

asp.net-mvc dependencies dependency-injection mef asp.net-mvc-areas

11
推荐指数
1
解决办法
2800
查看次数

从常量字符串列表中使用INNER JOIN进行SQL INSERT

我想创建一个SQL Server 2012查询,它将一个常量的权限名称列表,例如"ViewUsersPermission","ModifyUsersPermission"插入表RolePermissions.

此表有两列:"RoleID",它是Roles表的外键,以及varchar列"PermissionTypeName".

INSERT INTO [dbo].[RolePermissions] ([PermissionTypeName], [RoleID])

   SELECT 'ViewUsersPermission' AS [PermissionTypeName]
   UNION ALL
   SELECT 'ModifyUsersPermission' AS [PermissionTypeName]
   UNION ALL
   SELECT 'ViewRolesPermission' AS [PermissionTypeName]

   INNER JOIN   (SELECT [RoleID] FROM [dbo].[Roles]
                WHERE [Name] = 'Administrator')
Run Code Online (Sandbox Code Playgroud)

我正在寻找更好的解决方案.我想指定一个权限类型列表,如:

SELECT FROM 'ViewUsersPermission', 'ModifyUsersPermission', 'ViewRolesPermission' 
Run Code Online (Sandbox Code Playgroud)

而不是使用UNION ALL构造.

sql sql-server

3
推荐指数
1
解决办法
1万
查看次数

AutoFac解析参数

我有许多实现IFilter接口的过滤器类(定义过滤器逻辑).使用构造函数注入,对于每个过滤器实现,我想传递一个定义过滤器设置的接口.请考虑以下示例:

interface IFilter
{
  void Filter(DataSource dataSource);
}

interface ITimeSpanFilterSettings
{
  DateTime From {get; set; }
  DateTime To {get; set; }
}

public class TimeSpanFilter : IFilter
{
  private ITimeSpanFilterSettings settings;

  public TimeSpanFilter(ITimeSpanFilterSettings settings)
  {
     this.settings = settings;
  }
}
Run Code Online (Sandbox Code Playgroud)

ITimeSpanFilterSettings但是,我的具体实现需要settingsKey从数据库中检索设置.但是我无法ITimeSpanFilterSettings用静态注册我的实现 settingsKey.

是否有可能解决所有IFilter实现并指定settingsKey应该用于实例化ITimeSpanFilterSettings实现的实现?

autofac

0
推荐指数
1
解决办法
5148
查看次数