我想在一个单独的(C#)项目中创建一些“基于扩展的helpers”。例如,这些html助手在www.asp.net中进行了描述。
因为这些方法是HtmlHelper类的扩展,而HtmlHelper类位于System.Web.Mvc装配中,所以项目需要对此程序集进行引用。但是,然后该项目依赖于特定的MVC版本(3、4、5等)。
我想编写MVC帮助程序,它们独立于MVC版本(但基于扩展)。这个是可能的吗?
我知道配置,但是如果客户端(使用MVC帮助的项目)没有被迫使用这个<bindingRedirect />元素,我会很高兴。
发布于 2014-12-16 06:08:11
您不应该担心客户端必须添加绑定重定向。这是几年前Nuget解决的问题。
因此,与其共享dll,不如共享nuget包。您可能需要多个版本,因为绑定重定向从MVC 3到MVC 5不起作用(因为MVC 5中消除了中度信任更改)。因此,最终您将得到两个nuget包(在AutoFac上搜索nuget.org上的MVC以查看他们做了什么),或者只是支持MVC 5及更高版本,它已经发布了一年多了。
将nuget包放置在nuget.org中(或者您可以使用私有的nuget提要),并确保您的包依赖于MVC,并将正确的版本作为主要版本和次要版本。您可能需要其中的几个来匹配MVC版本。
nuget的好处在于兼容的版本(比如MVC 5、5.1、5.2、5.2.2等等)。使用您的代码,您将只需要一个dll和Nuget将自动添加绑定重定向,而不需要最终用户键入它们。
创建nuget包的多么
发布于 2014-12-15 22:18:49
我不确定是否有更好的方法来执行“条件依赖”,但我这样做的方法是手动编辑.csproj文件。例如,下面是来自MvcSiteMapProvider项目的一个示例:
<ItemGroup Condition=" $(DefineConstants.Contains('MVC2')) ">
<Reference Include="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
</ItemGroup>
<ItemGroup Condition=" $(DefineConstants.Contains('MVC3')) ">
<!-- Due to the windows update MS14-059, we need this hack to ensure we can build MVC3 both on machines that have the update and those that don't -->
<Reference Condition=" Exists('$(windir)\Microsoft.NET\assembly\GAC_MSIL\System.Web.Mvc\v4.0_3.0.0.0__31bf3856ad364e35\System.Web.Mvc.dll') " Include="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
<Reference Condition=" !Exists('$(windir)\Microsoft.NET\assembly\GAC_MSIL\System.Web.Mvc\v4.0_3.0.0.0__31bf3856ad364e35\System.Web.Mvc.dll') " Include="System.Web.Mvc, Version=3.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.Mvc.3.0.20105.1\lib\net40\System.Web.Mvc.dll</HintPath>
</Reference>
<Reference Include="System.Web.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.Razor.1.0.20105.408\lib\net40\System.Web.Razor.dll</HintPath>
</Reference>
<Reference Include="System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.1.0.20105.408\lib\net40\System.Web.WebPages.Razor.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup Condition=" $(DefineConstants.Contains('MVC4')) ">
<Reference Include="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.Mvc.4.0.20710.0\lib\net40\System.Web.Mvc.dll</HintPath>
</Reference>
<Reference Include="System.Web.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.Razor.4.0.20715.0\lib\net40\System.Web.Razor.dll</HintPath>
</Reference>
<Reference Include="System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.4.0.20710.0\lib\net40\System.Web.WebPages.Razor.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup Condition=" $(DefineConstants.Contains('MVC5')) ">
<Reference Include="System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.Mvc.5.0.0\lib\net45\System.Web.Mvc.dll</HintPath>
</Reference>
<Reference Include="System.Web.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.Razor.3.0.0\lib\net45\System.Web.Razor.dll</HintPath>
</Reference>
<Reference Include="System.Web.WebPages, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.3.0.0\lib\net45\System.Web.WebPages.dll</HintPath>
</Reference>
<Reference Include="System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Private>True</Private>
<HintPath>..\packages\Microsoft.AspNet.WebPages.3.0.0\lib\net45\System.Web.WebPages.Razor.dll</HintPath>
</Reference>
</ItemGroup>当然,在整个代码中都有用于MVC2、MVC3、MVC4和MVC5的常量,以及对每个版本重用相同代码基的常量。构建项目时,构建脚本将MVC版本作为参数传递,并为每个MVC版本创建一个单独的DLL。
注意:虽然这很好,但Visual在带有黄色图标的引用列表中显示了非选定的引用,这可能有点令人不安。我还没有找到一种在Visual中很好地显示或实际上可以用Visual的工具进行编辑的方法。
全面披露:我是MvcSiteMapProvider的主要贡献者之一。
https://stackoverflow.com/questions/27493680
复制相似问题