2

我不是直接寻找代码,而是寻找一些如何最好地解决我的问题的想法。

我正在处理这个 asp.net mvc 应用程序。它应该是“高度模块化的”,并且许多部分必须在不同的项目中重复使用。

我们当前的方法是使用托管可扩展性框架在运行时导入程序集。这些通常包括工作所需的一切;模型、视图和控制器。导入时会注册路线和导航/主菜单按钮。到目前为止,这有效;例如,我可以简单地将“news-column”程序集复制到任何其他项目中,包括 MEF 的东西,并且“神奇地”新项目提供可在 /News/List 访问的新闻功能。

然而,问题是,虽然在大多数情况下,程序集中提供的默认视图适合,但我有时希望导入的控制器显示不同的视图,在自定义布局中显示其他字段。我目前的方法是使模块中的操作方法虚拟化。如果另一个项目需要使用自定义视图呈现列表,我只需重写列表方法,调用基本方法来填充 ViewData,然后只需调用我想要的任何视图。但是,这不知何故感觉很脏,如果有人知道更好的解决方案,我将不胜感激。

我面临的另一个问题是我可能希望导入的模型与不同的表一起使用。我们将使用 Fluent NHibernate,其中目标表在 ClassMap - Table("News") 中定义。映射是这样导入的:

foreach(Assembly assembly in assemblies)
  configuration.Mappings(m => m.FluentMappings.AddFromAssembly(assembly));

我不知道如何更改导入的映射表,但我想有一个简单的方法?

感谢您至少阅读此内容:)

4

1 回答 1

0

我不认为覆盖你的控制器动作应该感觉“脏”。事实上,我使用通用库中的基本控制器操作来处理可以轻松抽象的事情,例如用户身份验证。另一方面,身份验证通常非常特定于 UI,因此我并不真正费心创建可重用的视图。

我还在我的应用程序中创建基本控制器类来处理创建/处置我的 EF 上下文等。

您可能需要考虑抽象您的数据访问。即使您使用 NHibernate 并且您的标准实现使用特定的 DB 模式,您也遇到了一个非常经典的代码重用问题:在可重用包中放置了太多特定的逻辑。作为一般规则,我尝试将任何数据库细节排除在可重用代码之外。我使用 POCO 对象和接口,因此我可以使用任何类型的数据源来创建我的对象。然后,我可能会使用 SQL Server、EF、我首选的 DB 模式等来使用标准实现的另一个程序集。但是,如果我需要将它连接到其他东西,我会在新版本中简单地实现接口。

希望这能回答你的问题。

于 2012-02-25T17:14:24.667 回答