2014-12-15 7 views
5

Chciałbym utworzyć "pomocników HTML opartych na rozszerzeniu" w oddzielnym projekcie (C#). Te pomocniki html są na przykład opisane pod adresem www.asp.net.Pomocników ASP.NET MVC, niezależna wersja MVC

Ponieważ metody są rozszerzeniami klasy HtmlHelper, a klasa HtmlHelper znajduje się wewnątrz System.Web.Mvc Assembly, projekt wymaga odwołania do tego zestawu. Ale wtedy projekt jest zależny od konkretnej wersji MVC (3, 4, 5 itd.).

Chciałbym napisać pomocników MVC, którzy są niezależni od MVC (ale w oparciu o rozszerzenie). czy to możliwe?

Jestem świadomy konfiguracji <bindingRedirect />, ale byłoby miło, gdyby klient (projekt korzystający z pomocy MVC) nie był zmuszony do używania tego `elementu.

+0

rzucić okiem na [Ninject.Web.Mvc] (https://github.com/ninject/ninject.web. mvc) i [MvcSiteMapProvider] (https://github.com/maartenba/MvcSiteMapProvider) projekty.Używają symboli/projektów, aby zachować referencje oddzielnie, ale udostępniają bazę kodów (używając pojedynczego pliku). –

Odpowiedz

1

Nie należy obawiać się, że klient będzie musiał dodać przekierowania wiązania. To był problem, który kilka lat temu rozwiązał Nuget.

Więc zamiast dzielić bibliotekę dll, udostępnij pakiet Nuget. Prawdopodobnie będziesz potrzebować wielu wersji, ponieważ przekierowania wiążące nie działają od MVC 3 do MVC 5 (z powodu usunięcia średnich zmian zaufania w MVC 5). Tak więc skończysz z dwoma pakietami nuget w sumie (szukaj AutoFac MVC na nuget.org, aby zobaczyć, co zrobili) lub po prostu obsługuj MVC 5 i wyżej, to już od ponad roku.

Umieść pakiet nuget w witrynie nuget.org (lub możesz użyć prywatnego pliku danych nuget) i upewnij się, że twój pakiet jest zależny od MVC, a odpowiednie wersje to major i minor. Możesz potrzebować kilku z nich, aby pasowały do ​​wersji MVC.

Zaletą nuget jest to, że dla wersji, które są kompatybilne (np. MVC 5, 5.1, 5.2, 5.2.2 itp.) Z Twoim kodem, potrzebujesz tylko pojedynczej biblioteki dll, a Nuget automatycznie doda przekierowania bez końcowego użytkownika posiadającego je wpisać.

How stworzyć Nuget pakiet

1

Nie jestem pewien, czy istnieje lepszy sposób na wykonanie "warunkowych zależności", ale sposób w jaki robię to ręczne edytowanie pliku .csproj. Na przykład, oto próbka z projektem 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> 

I wtedy oczywiście, istnieją stałe dla MVC2, MVC3, MVC4 i MVC5 używane w kodzie, a także, aby używać tego samego codebase dla każdego wersja. Kiedy projekt jest zbudowany, skrypt budujący przekazuje wersję MVC jako parametr i dla każdej wersji MVC tworzona jest osobna biblioteka DLL.

Direct link to the csproj file

UWAGA: Chociaż to działa prawidłowo, Visual Studio pokazuje nieaktywnym odniesień w spisie literatury z żółtą ikoną, która może być nieco niepokojące. Nie znalazłem sposobu na wykonanie tej pracy w sposób, który ładnie wyświetla się w Visual Studio lub który może być edytowany za pomocą narzędzi Visual Studio.

Full Disclosure: Jestem głównym czynnikiem przyczyniającym się do MvcSiteMapProvider.