• 1399/05/14

MultiLayer Solution :

درود

استاد عزیز

اگر برنامه رو به چند لایه مطابق دوره معماری تمیز آقای مدائنی تبدیل کنیم و IUtilities , Utilities رو به لایه دیگه منتقل کنیم درنتیجه Assembly.GetExecutingAssembly() دیگه مقداری بر نمی گردونه چون توی اون لایه (پروژه) ما کنترلر نداریم.

چطوری تغییرش بدم که کنترلر های لایه Presentation رو برگردونه؟

ممنون و سپاسگذارم

  • 1399/05/14
  • ساعت 23:12

سلام عزیز.

میتونید از این کد استفاده بکنید:

public interface IMvcUtilities
{
        public
IList<(string areaName, string controllerName, string actionName)> ValueTuples { get; }
}

و کلاس implement کنندش:

public class MvcUtilities : IMvcUtilities
    {
        /// <summary>
        /// Will add all area and controller and action names into a List of tuple.
        /// </summary>
        public MvcUtilities(IActionDescriptorCollectionProvider actionDescriptorCollectionProvider)
        {
            var actionDescriptors = actionDescriptorCollectionProvider.ActionDescriptors.Items;
            foreach (var actionDescriptor in actionDescriptors)
            {
                var descriptor = actionDescriptor as ControllerActionDescriptor;
                if (descriptor == null) continue;

                var controllerTypeInfo = descriptor.ControllerTypeInfo;
                //var actionMethodInfo = descriptor.MethodInfo;

                ValueTuples.Add((controllerTypeInfo.GetCustomAttribute<AreaAttribute>()?.RouteValue,
                    descriptor.ControllerName,
                    descriptor.ActionName));
            }
        }

        public IList<(string areaName, string controllerName, string actionName)> ValueTuples { get; } 
            = new List<(string areaName, string controllerName, string actionName)>();
    }

بخوام به طور خلاصه توضیح بدم یه پراپرتی داریم که اسمش ValueTuples  هستش که میتونید اسمش رو تغییر بدید.

توی کلاس MvcUtilities توی constructor، کدی نوشته شده که میاد نام تمامی  area ها و کنترلر ها و اکشن متود هارو به اون پراپرتی ( ValueTuples ) اضافه میکنه. که میتونید این کلاس رو به صورت Singleton اضافه کنید یا به یه طریقی static بکنیدش که هر دفعه اون کد ها اجرا نشه و فقط دفعه اول کد ها اجرا بشه.


  • 1399/05/25
  • ساعت 00:18

سلام استاد

بابت کدهای بالا خیلی ممنونم

یک مشکلی که توی تعریف role داشتیم تکراری بودن area|controller|action بود

کدهای شما با توجه به متد بالا اینطوری میشه

 var list = ValueTuples.Select(t => new ActionAndControllerName()
            {
                AreaName = t.areaName,
                ControllerName = t.controllerName,
                ActionName = t.actionName
            });

            return list.Distinct().ToList();

حالا اگر بصورت زیر بنویسیمش دیگه تکراری نمیده

 var list = ValueTuples.Distinct().Select(t => new ActionAndControllerName()
            {
                AreaName = t.areaName,
                ControllerName = t.controllerName,
                ActionName = t.actionName
            });

            return list.ToList();

خیلی از شما ممنونم


  • 1399/05/25
  • ساعت 11:09

بله درسته.

تشکر بابت راهنمایی.

 

امیدوارم لبتون همیشه خندون باشه :)


  • 1399/05/25
  • ساعت 11:25

استاد چوب کاری نفرمایید

ما از شما یادمیگیریم

انعکاس مطلب صرفا جهت استفاده دوستانی که به همین مشکل بر میخورن عنوان شده.

تشکر بابت دوره بسیار عالی


logo-samandehi