‫۹ سال و ۹ ماه قبل، سه‌شنبه ۲ دی ۱۳۹۳، ساعت ۱۶:۴۶
برای مواردی که در پروژه پیش میاد و مجبور هستیم تا یک نمونه کلاس بدون پارامتر رو ایجاد کنیم چه راهکاری رو پیشنهاد می‌کنید؟ چون عملاً اون کلاس نمی‌تونه وابستگی‌های خودش رو از طریق تابع سازنده اش اعلام کنه.
به عنوان مثال در کد زیر من می‌خوام یک Custom Route Constraint تعریف کنم:
routes.MapRoute(
   name: "PagesById",
   url: "Page/{id}",
   defaults: new { controller = "Route", action = "PageById", id = UrlParameter.Optional },
   constraints: new { id = new CustomPageByIdRoute() }
);
و اینجا نمی‌تونم پارامتری به کلاس CustomPageByIdRoute بدم . کلاس CustomPageByIdRoute به این صورت هست:
    public class CustomPageByIdRoute : IRouteConstraint
    {
        private readonly IUnitOfWork _uow;
        private readonly IPage _page;

        public CustomPageByIdRoute(IUnitOfWork uow, IPage page)
        {
            _uow = uow;
            _page = page;
        }

        public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
        {
            return _page.FindBy(x => x.Id == Convert.ToInt32(values[parameterName]) && x.DeletedBy == 0).FirstOrDefault() != null;
        }
    }

‫۹ سال و ۱۰ ماه قبل، دوشنبه ۱۷ آذر ۱۳۹۳، ساعت ۱۶:۱۱
- بله می‌شود. از الگوی service locator استفاده کنید:
@{
    ViewBag.Title = "Index";

    var categoryService = ObjectFactory.Container.GetInstance<ICategoryService>();
    var list = categoryService.GetAllCategories();
}
- اما ... اینکار برخلاف رویه MVC است. در الگوی MVC یک View نباید مستقیما کوئری بگیرد. View فقط باید اطلاعات مورد نیاز خود را از کنترلر مرتبط دریافت کند.
اطلاعات بیشتر: Don’t Query from the View 
- اگر نیاز است یک سری اطلاعات تکراری در هر اکشن متد به Viewها تزریق شود، روال کار AOP است. در MVC برای پیاده سازی AOP فقط کافی است یک ویژگی جدید از نوع ActionFilterAttribute تعریف کنید و خواص تکراری را به آن منتقل کنید:
public class DuplicateInfo : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            filterContext.Controller.ViewBag.CanonicalUrl = "redirectUrl ..... ";

            base.OnActionExecuting(filterContext);
        }
    }
در اینجا برای نمونه، نحوه‌ی دسترسی به ViewBag را مشاهده می‌کنید. اکنون اکشن متدی که به ویژگی DuplicateInfo مزین شود، به تمام اطلاعات تنظیم شده توسط آن هم دسترسی خواهد داشت.
‫۹ سال و ۱۰ ماه قبل، دوشنبه ۱۷ آذر ۱۳۹۳، ساعت ۱۵:۴۳
آیا می‌شود سرویسی را به ویو تزریق کرد؟ به طور مثال درون یک ویو به سرویس SecurityService دسترسی داشته باشیم:
@if (!SecurityService.IsAuthenticated)
{
                            <li>@Html.ActionLink("ورود", "Login", "Main")</li>
}
برای اینکار یک ViewPage سفارشی ایجاد کردم ولی برای تزریق وابستگی‌ها چیز خاصی به ذهنم نمی‌رسه.
public abstract class CustomViewPage : ViewPage
    {
        public CustomViewPage(IUserService userService, ISecurityService securityService, IUnitOfWork uow)
        {
            Uow = uow;
            SecurityService = securityService;
            UserService = userService;
        }

        public IUserService UserService { get; private set; }
        public ISecurityService SecurityService { get; private set; }
        public IUnitOfWork Uow { get; private set; }
        
    }
    public abstract class CustomViewPage<TModel> : ViewPage<TModel>
    {
        public CustomViewPage(IUserService userService, ISecurityService securityService, IUnitOfWork uow)
        {
            Uow = uow;
            SecurityService = securityService;
            UserService = userService;
        }

        public IUserService UserService { get; private set; }
        public ISecurityService SecurityService { get; private set; }
        public IUnitOfWork Uow { get; private set; }

        
    }
آیا در زمان Initialize کردن وابستگی‌ها باید تنظیم خاصی صورت گیرد؟
‫۹ سال و ۱۰ ماه قبل، چهارشنبه ۵ آذر ۱۳۹۳، ساعت ۱۶:۰۹
- نال بودن controllerType صرفا به معنای یافت نشدن آدرس درخواستی است. این مساله پیش از رجوع به StructureMap رخ می‌دهد و ارتباطی به آن ندارد.
- مثال کامل بحث جاری که به همراه یک Area نیز هست؛ برای دریافت:
DI06.zip
‫۹ سال و ۱۰ ماه قبل، سه‌شنبه ۴ آذر ۱۳۹۳، ساعت ۱۶:۰۳

با سلام

در استفاده عادی و بدون structureMap مشکلی ندارم اما زمانی که از StructureMap  استفاده می‌کنم

در کلاس DefaultControllerFactory در متد GetControllerInstance مقدار controllerType برای Area‌ها null برمی گردد

همون طور کد خدمتتون عرض کردم در حالت عادی و بدون structormap مشکلی وجود ندارد و کلی مسیر دهی‌ها به درستی انجام می شود ولی در زمان استفاده از Ioc با Area‌ها مشکل دارم.

در اینجا مطلبی دیدم که مسیردهی‌ها را از طریق یک Super کلاس انجام داده اند که فکر نمی‌کنم مسیردهی مجدد کار درستی باشد و از طرفی super کلاس من بین کنترل‌های Area و کنترل‌های خارج از Area مشترک است و نمی‌تونم همچین کاری انجام بدم.

چرا در GetControllInstance مقدار controllerType در زمان استفاده از structoremap برای مسیرها و کنترل‌های موجود در Area‌ها null است در حالتی که بدون استفاده از آن مسیردهی به درستی انجام می‌شود

‫۹ سال و ۱۰ ماه قبل، سه‌شنبه ۲۷ آبان ۱۳۹۳، ساعت ۰۵:۳۵
- در مورد خطای «No Default Instance defined » کمی بالاتر در نظرات بحث شده. یعنی تنظیمات اولیه ناقصی دارید. ادامه‌ی پیام آن هم بسیار واضح است. عنوان کرده تنظیمات اولیه مرتبط را پیدا نمی‌کند.
در پروژه‌ی ثالث یاد شده، در کلاس IoC آن، کار <AddRegistry<DefaultRegistry انجام شده‌است و اگر در برنامه‌ی شما IoC.Initialize  فراخوانی نشود، کلاس DefaultRegistry جایی استفاده نخواهد شد و پس از آن پیام یافت نشدن تنظیمات را دریافت می‌کنید.
همچنین این کتابخانه از  Microsoft.Web.Infrastructure.DynamicModuleHelper برای کارهای Service locator استفاده کرده‌است. به عبارتی اگر در حالت عادی جواب می‌گیرید (مثلا تزریق وابستگی در کنترلرها درست کار می‌کنند) اما با فراخوانی ObjectFactory مشکل دارید، از این جهت است که DefaultRegistry آن اصلا به ObjectFactory معرفی نشده‌است. اما DefaultRegistry و خروجی IoC.Initialize آن به صورت محدود در اختیار ماژول‌های این کتابخانه قرار گرفته‌اند.

-  در کل روشی که در مطلب جاری عنوان شده، بررسی زیر ساخت این ابزارها است و با MVC 5 هم کار می‌کند. با 3 و 4 هم کار می‌کند.