asp.net mvc文件夹/对象层次结构

时间:2013-02-12 06:31:50

标签: asp.net-mvc oop architecture import import-from-csv

背景

我有一个使用CSV文件导入产品的Asp.net MVC 3.5应用程序。 CSV文件可以来自特定的可配置源组。要配置新的CSV源,用户最初会指定哪些CSV列映射到哪些产品属性。此配置将存储为导入模板,并在执行每次导入后可供选择。

我试图计划此功能的文件夹/对象结构时遇到了问题。我理解(并且喜欢)Asp.net MVC的灵活性,所以我知道我们可以做任何事情。但是,我想任何有助于我们保持对象结构更健全和可维护的建议。

最初我设置了一个包含Import.aspx视图的Product文件夹。这似乎足够适合控制器/动作模型。但是,当我考虑上面提到的管理模板的功能时,事情会变得混乱。

编辑:导入模板可以应用于不同的对象。因此,Product只是一个可以为其创建一个或多个ImportTemplates的对象。例如,可能具有ImportTemplate的另一个对象可以是Customer。

问题

我应该在Product文件夹下创建一个名为ImportTemplate的子文件夹并将CRUD视图放在那里吗?然后,我将为导入模板功能添加自定义路由。我关心的是文件夹深度以及与兄弟动作导入的混淆。或者ImportTemplate应该升级,然后使用路由将其放在Product文件夹下?听起来很乱。

也许文件夹结构应该是Product / Import / Template。我在这种情况下看到的问题是Import实际上不是一个对象。我可以看到它是一个控制器,但它确实是动作。如果我使用这个结构,我应该在Import文件夹中放置一个Upload.aspx视图(以替换上面提到的Product / Import.aspx)?这似乎有点笨拙。

编辑:由于上面添加的要求可以将ImportTemplate与Product(即Customer)以外的对象相关联,最好将ImportTemplate文件夹直接放在Views文件夹下吗?

构建此对象/文件夹层次结构的其他任何想法?

研究

为了研究这个问题,我回顾了有关文件夹结构和深度的问题。以下是几个有答案的问题,但实际上没有回答我的问题。

- ASP.NET MVC How many levels deep should a view or URL be?

- ASP.NET MVC 3 folder structures

- Strategy for Hierarchical MVC Routing

示例

编辑:用户定期从第三方导入产品列表。他们正在从CSV文件导入数据,该文件将上传到网站。他们在其帐户中创建/添加产品导入模板的实例。此模板实例存储以下设置:

  • CSV文件中名为“title”的列应导入“产品名称”字段。
  • CSV中“类别”列下无法识别的类别应导入为“未知”类别。

其他用户可能根据不同的第三方CSV格式或基于他们自己的系统配置而有不同的规则(即他们没有像上面的用户那样设置未知类别)。

  • CSV中名为“部件号”的列应导入“产品名称”字段和“产品编号”字段。
  • 默认情况下,无法识别的类别应导入“通用”类别。

1 个答案:

答案 0 :(得分:0)

你是绝对正确的,鉴于ASP MVC的灵活性,你可以在这里做任何关于文件夹结构的事情。如果您习惯使用ASP.NET WebForms,请记住MVC完全不同,因为它不使用文件夹和文件作为资源的直接映射,并且路由基于控制器和操作。当你习惯用“ASP经典”的方式时,这可能会习惯。

因此,关键考虑因素是对您和您的用户最有意义的,并且每个人都清楚一切都在哪里。

  

也许文件夹结构应该是Product / Import / Template。该   在这种情况下我看到的问题是Import实际上不是一个对象。   我可以看到它是一个控制器,但它真的意味着它   行动。如果我使用这个结构,我应该放入一个Upload.aspx视图   导入文件夹(替换提到的Product / Import.aspx   以上)?这似乎有点笨拙。

是的,听起来你的控制器应该有一个导入操作或上传操作等等......其中每个都可以在该控制器的视图文件夹中有相应的视图,但模板本身可能不需要视图。您的模板只是导入产品时控制器操作将引用的资源。在这种情况下,自定义路由不会成为问题,我不会将模板放在视图文件夹中。我将它们放在一个中心位置,并在所有需要访问它们以进行导入操作的控制器中引用它们。

您可以使用以下内容:

MyApp project
    Controllers
        ProductController
    Models
        Product
    ImportTemplate
        Template1
        Template2
    Views
        Product
            Import.aspx
            Edit.aspx
            Index.aspx
            etc…    

Import.aspxUpload.aspx可能是用户可以选择模板并导入产品(或映射列并保存新模板)的页面。每个视图都有一个相应的控制器动作。您的控制器的导入或上载操作将直接访问模板文件;您需要做的就是在控制器中包含对ImportTemplate文件夹的引用(或模型,服务层......将使用模板的任何地方)

using  MyApp.ImportTemplate
//namespace matches folder structure, “MyApp/ImportTemplate”

当用户在产品导入页面上时,该网址将类似于/Product/Import/,并且模板本身不一定会显示在网址中,除非您将其作为参数/Product/Import/templateID或{{1}传递}。

同样,关键是要做对您的项目最有意义的事情,并为您保持井井有条和清晰,并且在您构建/部署应用程序时可以节省您的时间。

例如,我倾向于将事情分成两个或更多项目,以便在部署时更容易。举个例子,我可能有这样的文件夹结构:

/Product/Import?templateID=123456

然后我需要部署的是App.UI project Content CSS Scripts Images Views App.Core project (any code that will be compiled) Controllers Templates Models Helpers Interfaces Repositories ViewModels 项目,App.UI中的所有内容都将被编译并包含在App.Core文件夹中