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

Ric*_*h C 6 architecture oop import asp.net-mvc 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视图或URL应该有多少级别?

- ASP.NET MVC 3文件夹结构

- 分层MVC路由策略

一个例子

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

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

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

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

小智 0

您\xe2\x80\x99 绝对正确,考虑到 ASP MVC 的灵活性,您可以在此处执行有关文件夹结构的任何操作。如果您习惯 ASP.NET WebForms,请记住 MVC 完全不同,因为它不使用文件夹和文件作为资源的直接映射,并且路由基于控制器和操作。当您习惯以“ASP 经典”方式执行此操作时,这可能需要习惯。

\n\n

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

\n\n
\n

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

\n
\n\n

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

\n\n

你可以使用这样的东西:

\n\n
MyApp project\n    Controllers\n        ProductController\n    Models\n        Product\n    ImportTemplate\n        Template1\n        Template2\n    Views\n        Product\n            Import.aspx\n            Edit.aspx\n            Index.aspx\n            etc\xe2\x80\xa6    \n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
using  MyApp.ImportTemplate\n//namespace matches folder structure, \xe2\x80\x9cMyApp/ImportTemplate\xe2\x80\x9d\n
Run Code Online (Sandbox Code Playgroud)\n\n

当用户位于产品导入页面时,URL 将类似/Product/Import/,并且模板本身不一定会出现在 URL 中,除非您将其作为参数/Product/Import/templateID/Product/Import?templateID=123456.

\n\n

同样,关键是做对您的项目最有意义的事情,让事情井井有条、清晰明了,并且在您\xe2\x80\x99 构建/部署应用程序时可以节省时间。

\n\n

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

\n\n
App.UI project\n    Content\n        CSS\n    Scripts\n    Images\n    Views\n\nApp.Core project (any code that will be compiled)\n    Controllers\n    Templates\n    Models\n        Helpers\n        Interfaces\n        Repositories\n    ViewModels\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我需要部署的就是App.UI项目,其中的所有内容都App.Core将被编译并包含在App.UI\\bin文件夹中

\n