ماژولار کردن Asp.Net MVC با قابلیت نصب

در این مقاله با روش هایی برای ماژولار (modular) کردن پروژه های Asp.Net MVC و قابلیت نصب آن در برنامه های مختلف صحبت خواهیم کرد.

ماژولار کردن Asp.Net MVC با قابلیت نصب

 

برای شروع کار ابتدا با ویژوال استدیو اقدام به ایجاد پروژه ای تحت وب با از نوع MVC با زبان C# می کنیم.

این پروژه ، پروژه اصلی ما در این مقاله است.

فایل های ایجاد شده را در Solution Explorer مشاهده می کنید.

سپس برروی پوشه Controller کلیک راست می کنیم و بر روی Add Controller کلیک می کنیم ، تا کنترلی جدید به صفحه اضافه کنیم سپس نام کنترلر را برابر Home قرار می دهیم.

کنترلری از نوع Empty و با نام Home را ایجاد می کنیم.

در این مرحله بر روی Action با نام Index کلیک راست می کنیم و سپس گزینه Add View را انتخاب می کنیم.

حال در پوشه View به پوشه Shared می رویم و سپس کد های زیر را به صفحه _Layout اضافه می کنیم.
 

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width" />
    <title>@ViewBag.Title</title>
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")
</head>
<body dir="rtl" style="padding:25px;">
    <div>
        <div>
            <h2>برنامه نویسان - ماژولار کردن Asp.Net MVC با قابلیت نصب</h2>
        </div>
        <div id="nav">
            @Html.ActionLink("خانه", "Index", "Home", new { Area = "" }, null) |
            @Html.ActionLink("تبلیغات", "Index", "Marketing", new { Area = "Marketing" }, null) |
            @Html.ActionLink("پرداخت", "Index", "Billing", new { Area = "Billing" }, null) |
            @Html.ActionLink("فهرست", "Index", "Inventory", new { Area = "Inventory" }, null) |
            @Html.ActionLink("انبار", "Index", "Warehouse", new { Area = "Warehouse" }, null)
        </div>
        <hr />
        <div>
            @RenderBody()
        </div>
    </div>
    @Scripts.Render("~/bundles/jquery")
    @RenderSection("scripts", required: false)
</body>
</html>

 

پروژه را اجرا می کنیم تا نتیجه را ببینیم.

سپس یک Area به نام Marketing ایجاد می کنیم.
برای این منظور برروی نام پروژه راست کلیک می کنیم و سپس گزینه Add و گزینه Add Area را انتخاب  می کنیم.

در Solution Explorer قسمت های ایجاد شده را مشاهده می کنید.

حالا قبل از حذف پوشه Marketing در قسمت بعدی ابتدا از فایل MarketingAreaRegistraion.cs یک نسخه پشتیبان نگه داری می کنیم.
این فایل در هنگامی که ما ماژول جدید را به صورت پروژه ای جدید به Solution اضافه می کنیم ، مورد نیاز است.در ضمن این فایل می تواند به صورت دستی نیز ایجاد و افزوده شود ولی برای سرعت بخشیدن به روند توسعه ما از همین فایل استفاده می کنیم.
حالا پوشه Marketing از قسمت Area را حذف می کنیم و سپس یک پروژه جدید به Solution اضافه می کنیم که پس برروی کلیک راست می کنیم و در قسمت نام ؛ نام پروژه را به Marketing تغییر می دهیم و سپس بر در انتهای Location مقدار "\Asp.Net MVC Madular Pluggable\Areas\..." قرار می دهیم.


در پروژه ایجاد شده که از نوع MVC آن را ایجاد کردیم پوشه های زیر را حذف می کنیم.
App_Data
App_Start
Content folder
Shared sub-folder under View
global.asax file

 

این فایل ها برای یک پروژه MVC نیاز هستند ولی برای یک ماژول نیاز نیستند.سپس فایل های زیر را در Solution Explorer مشاهده می کنید.

 

اگر بر روی گرینه Show All Files که در قسمت زیر مشخص شده است کلیک کنید مشاهده می کنید که به علت آدرسی که در مرحله ایجاد پروژه آدرس دهی کردیم پروژه در Area قرار دارد.

 

حالا در قسمت RouteConfig.cs در پروژه تنظیمات زیر را اضافه می کنیم.
 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace Asp.Net_MVC_Madular_Pluggable
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default",
                "{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                new string[] {"Asp.Net_MVC_Madular_Pluggable.Controllers"}
            );
        }
    }
}

 

حال فایل MarketingAreaRegistration.cs که از آن نسخه پشتیبان تهیه کردیم را در پروژه قرار می دهیم و در قسمت مربوطه اضافه می کنیم.
 

using System.Web.Mvc;

namespace Asp.Net_MVC_Madular_Pluggable
{
    public class MarketingAreaRegistration : AreaRegistration 
    {
        public override string AreaName 
        {
            get 
            {
                return "Marketing";
            }
        }

        public override void RegisterArea(AreaRegistrationContext context) 
        {
            context.MapRoute(
                "Marketing_default",
                "Marketing/{controller}/{action}/{id}",
                new { controller = "Marketing", action = "Index", id = UrlParameter.Optional },
                new string[] { "Marketing.Controllers" }
            );
        }
    }
}

در این مرحله اقدام به تعویض output directory برای تعیین محل ایجاد فایل های Bin یا همان Dll های پروژه می کنیم. و مسیر را /bin/../... قرار می دهیم تا dll های پروژه ای که به عنوان ماژول اضافه می شود در کنار dll های پروژه ی اصلی قرار گیرد.

 

سپس در فایل web.config در پروژه ای که به عنوان ماژول قرار است نصب شود تمامی تنظیمات از جمله connection strings, authentication, membership, rolemanager, profile, and session state و... را حذف می کنیم.

سپس در پروژه Marketing اقدام به ایجاد کنترلری با نام Marketing می کنیم.
 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
 
namespace Marketing.Controllers
{
    public class MarketingController : Controller
    {
        //
        // GET: /Marketing/
 
        public ActionResult Index()
        {
            return View();
        }
 
    }
}

و برای Index یک View ایجاد می کنیم.
 

@{
    ViewBag.Title = "Index";
}
 
<h2>به ماژول Marketing خوش آمدید</h2>

 

حالا پروژه اصلی برای استفاده از ماژول Marketing آماده است ، ابتدا Solution را Build کنید و سپس dll های اضافه شده به پروژه اصلی را خواهید دید.
حال اگر پروژه را اجرا کنیم و آدرس را در Url وارد کنیم مشاهده می کنید که این صفحه یعنی index در کنترلر marketing از layout اصلی استفاده کرده است.

بدین صورت ما می توانیم ماژول های مختلفی را ایجاد و سپس از آن ها در پروژه های مختلف استفاده کنیم.

 

فایل های ضمیمه