我应该在Web或App层上生成文件吗?

时间:2011-08-02 08:35:15

标签: asp.net-mvc web-applications architecture

我有一个用MVC编写的3层Web应用程序(数据库,应用程序层,Web层)。

我想使用数据库中的数据在运行时生成Excel文件。

我最初的想法是在Web项目中引用Excel库并在控制器中生成文件。我可以直接将其流式传输到响应中,我可以将该文件视为数据的不同视图。我已经有了一个服务方法,它返回数据库中的数据,就像它在页面上使用一样。

我正在考虑在应用层上生成文件,然后将byte[]返回到Web层。这里的论点是文件生成是业务逻辑的一部分。

你会做什么?

3 个答案:

答案 0 :(得分:1)

excel输出实际上是视图的责任,因此您必须在控制器中执行此操作。模型/应用层只负责数据,而不是它的表示。

如果您使用的是ASP.Net MVC,则可以声明一个ExcelActionResult,它接收视图模型并将其转换为CSV / Excel输出。一些相关信息:

Custom Excel Export Action

http://stephenwalther.com/blog/archive/2008/06/16/asp-net-mvc-tip-2-create-a-custom-action-result-that-returns-microsoft-excel-documents.aspx

答案 1 :(得分:0)

我同意,这是在BLL(应用层)生成文件的正确方法。在project中查看我们如何完成它。它有点复杂,因为我们的导出/导入模型可插拔,但它可能对你有意义。

首先我们描述了2个接口:

/// <summary>
/// Defines methods and properties for an import provider.
/// </summary>
public interface IImportProvider : IExtension
{
    #region Methods
    /// <summary>
    /// Imports a data.
    /// </summary>
    /// <param name="data">The data to be imported.</param>
    /// <param name="mimeType">The data MIME type.</param>
    void Import(byte[] data, string mimeType);
    #endregion
}

public interface IExportProvider : IExtension
    {
        #region Methods
        /// <summary>
        /// Exports a data.
        /// </summary>
        /// <param name="mimeType">Contains the data MIME type when this method returns.</param>
        /// <returns>The exported date.</returns>
        byte[] Export(ref string mimeType);
        #endregion
    }

我们可以为任何类型的导入/导出格式实现这些接口。因此,我们在BLL(应用层)处理导入/导出数据,然后,在导出的情况下,我们将其发送到表示层(Web层)。表示层按MIME类型解析文件扩展名并返回文件结果:

return File(data, mimeType, String.Format("export.{0}",  MimeTypeHelper.GetExtByMimeType(mimeType)));

这样,表示层不需要知道使用了哪种导入/导出格式。表示层所需的全部内容,用于从/向用户接收/发送数据。

答案 2 :(得分:-1)

根据所涉及的格式化数量,我可能会创建一个Reporting Services(RS)报告,并使用RS Web服务从数据库中的数据中获取Excel电子表格。