Asp.net mvc 您将常用web uri路径的方法放在哪里

Asp.net mvc 您将常用web uri路径的方法放在哪里,asp.net-mvc,helper,syndication-feed,Asp.net Mvc,Helper,Syndication Feed,我们有一个非常通用的架构: 数据库 存储库层 业务对象 服务层-向客户端提供DTO Web层(MVC) 我们有许多常见的资源路径,特别是图像和播客(例如)。我想创建一个具有以下属性的静态实用程序类: MySite.Utils.ImagePathUri MySite.Utils.PodcastsPathUri 等 我的问题是:uri路径放在哪里?该实用程序类应用于哪个项目? 起初,它似乎是一个不需要动脑筋的东西:web层。这是一个网站。我应该能够在其他层不知道的情况下更改站点的URL 一切都很好,

我们有一个非常通用的架构:

数据库

存储库层

业务对象

服务层-向客户端提供DTO

Web层(MVC)

我们有许多常见的资源路径,特别是图像和播客(例如)。我想创建一个具有以下属性的静态实用程序类:

MySite.Utils.ImagePathUri

MySite.Utils.PodcastsPathUri

我的问题是:uri路径放在哪里?该实用程序类应用于哪个项目?

起初,它似乎是一个不需要动脑筋的东西:web层。这是一个网站。我应该能够在其他层不知道的情况下更改站点的URL

一切都很好,但是。然后有一天我的一个服务需要提供一个SyndicationFeed类型。SyndicationFeed需要完整的URI,而不仅仅是部分文件名。但是这些服务不应该访问完整路径。还是应该

我已经和自己讨论了几件事,但不能提出一个坚定的立场:

  • 将路径移动到服务层。这将web层与服务层紧密耦合,但也许这没关系,因为它们从一开始就是紧密耦合的
  • 将路径移动到业务对象或回购。我不喜欢这个,但是如果我愿意把它放到服务层中,我至少要考虑一下。
  • 不要在服务层内部使用SyndicationFeed,而只在web层中使用它。解决了这个问题,但看起来SyndicationFeed应该属于服务层
  • 放弃SyndicationFeed。任何SyndicationFeed都可以更容易地在MVC中使用PartialView创建,该视图可以生成适当的XML,而不必处理像ElementExtensions这样臃肿的抽象。我喜欢这个,但是我们在很多地方使用了SyndicationFeed,所以其中一个需要做最多的解释
  • 在服务层向联合提要提供一个假uri,然后在web层对其进行更改。你能说黑客吗
  • 将完整路径放入数据库中。一开始听起来不错,但后来我意识到,一旦你有了一个动态生成的图像,它就会崩溃
  • 我没有想到的其他解决方案
  • 你的想法是什么?您将web资源(图像、播客等)的实用程序类放在哪里?如果你说“web层”,你对SyndicationFeed的问题有什么看法

    更新

    最后,我决定放弃SyndicationFeed类,这样就不需要在服务层和存储库层中包含文件的路径。然而,这个问题仍然在其他地方出现,使用DI,特别是像国际奥委会的Ninject,是非常有意义的。将它们包装到一个公共接口中也是如此

    SyndicationFeed、查看引擎以及为什么声明性更好

    我放弃了SyndicationFeed,而是使用Razor创建了所需的XML。它不仅更容易创建,而且可读性也提高了1000%。我认为使用命令式代码(C#,VB等)来创建XML比它应该做的更难。XML是声明性的,而不是强制性的


    相反,我现在认为视图引擎的声明性语法(如Razor)比命令式语言更容易使用。

    我感觉到了你的痛苦。我也遇到了类似的情况,我通过将uri从web层传递到存储库层来解决

    我的项目使用Ninject进行绑定,因为我已经使用Ninject将连接字符串传递到存储库,所以传递路径字符串也很简单

    然后,我的存储库处理路径字符串,并在我的业务对象中填充必要的属性

    这样合适吗?我不知道,但它现在起作用了。我对这个解决方案并不完全满意,但我还没有机会尝试改进


    我很想听听其他人是如何处理的。

    面对类似的情况,我觉得最好的办法是定义一个配置接口,在最顶层生成一个对象。中间的每一层都将使用更具体的属性和操作优化接口:

    public interface IWebConfiguration 
    {
        string RootImageUri { get; }
    }
    
    服务层将添加自身所需的内容:

    public interface IServicesConfiguration
    {
        string SyndicationFeedUri { get; }
    }
    
    public interface IDatabaseConfiguration
    {
        string ConnectionString { get; }
    }
    
    最后,我让web层实现连接所有接口的特定对象。丑陋?也许。我承认有人在那里要求isa,还有一些演员


    然而,我能够向每一层传递一个强类型接口。在我看来,这比从配置文件中调用一系列简单的旧字符串要好。另外,由于每个属性都是特定于某个层的,并且正在传递聚合对象,因此我只需加载一次配置。

    当您说“将uri传递到存储库层”时,是指配置文件(例如web.config)中的设置,还是指引用项目?我的路径字符串在web.config文件中。Ninject的绑定允许传递参数<代码>绑定(RepositoryInterface的)到(RepositoryClass的)。使用构造函数参数(“connectionString”,connString)。使用构造函数参数(“path”,uri)无可否认,我的解决方案依赖于Ninject为我完成繁重的工作。