Reflection
سلام من در یک solution 11 پروژه دارم که می خواهم در پروژه viewmodel یک reflection کنم به پروژه وب اما مشکلم اینه که
در constractor پروژه از structurmap استفاده کردم که این باعث error no parameter میشه . چکار باید کرد که در ساخت instance جدید با reflection وابستگی ها هم تزریق بشه . ممنون
8 پاسخ
ممنون از جوابتون .
اما من مشکلم اینجاست که دارم instance رو از یه پروژه دیگه می سازم و دسترسی به پارامتر ها ندارم در نتیجه نمی تونم پاس بدم . چه راه حلی بذهنتون می رسه ؟
می تونید از خود structuremap برای resolve کردن شئ استفاده کنید. کد زیر رو تست کنید ببینید مشکلتون حل میشه؟
var container = new StructureMap.Container(new IoC.TypesRegistry()); object instance = container.GetInstance(controller);
تو خط اول جای TypesRegistry کلاسی که خودتون برای تعریف Dependecy ها رو نوشتید مشخص کنید.
شما زمانی که قصد دارید Instance ایجاد کنید بعد از مشخص کردن نوع برای ایجاد می تونید پارامترهای مورد نظرتون رو مشخص کنید:
Activator.CreateInstance(controller, param1,param2,param3);
جای param1 الی param3 می تونید پارامترهای مورد نظرتون رو مشخص کنید که هنگام ساخت شئ به Constructor ارسال بشه. پارامترهای مشخص شده باید بر اساس پارامترهای Constructor باشه.
سلام، وقت بخیر
اگر از Reflection استفاده می کنید برای ایجاد شئ باید زمان ساخت Instance پارامتر ها رو به صورت دستی مشخص کنید، چون از StructureMap در این حالت استفاده نمیشه.
تفاوتی نمی کنه، شما زمانی که از Reflection استفاده می کنید برای ساخت Instance یکسری پارامترها رو به عنوان ورودی مشخص می کنید، اگر Constructor مورد نظرتون Private تعریف شده باید از طریق Reflection بگیرید که از طریق مشخص کردن flag ها می تونید اینکار رو بکنید. ولی اینکه گفتید دسترسی به پارامتر ها ندارید رو دقیقاً متوجه نشدم.
سلام
یعنی منظور شما اینه که میشه parameter های instance رو با flag بهش پاس داد ؟
public class CustomRemoteValidation : RemoteAttribute { protected override ValidationResult IsValid(object value, ValidationContext validationContext) { string controllerName = this.RouteData["controller"].ToString(); string actionName = this.RouteData["action"].ToString(); string[] additionalFields = this.AdditionalFields.Split(','); Type type = HttpContext.Current.ApplicationInstance.GetType(); Type controller = Assembly.GetAssembly(type.BaseType).GetTypes().FirstOrDefault(t => t.Name.ToLower() == ("Rent" + "Controller").ToLower()); // Get the controller using reflection //Type controller = Assembly.GetExecutingAssembly().GetTypes() // .FirstOrDefault(type => type.Name.ToLower() == string.Format("{0}Controller", // this.RouteData["controller"].ToString()).ToLower()); if (controller != null) { // Get the action method that has validation logic MethodInfo action = controller.GetMethods() .FirstOrDefault(method => method.Name.ToLower() == this.RouteData["action"].ToString().ToLower()); if (action != null) { // Create an instance of the controller class object instance = Activator.CreateInstance(controller); // Invoke the action method that has validation logic object response = action.Invoke(instance, new object[] { value }); if (response is JsonResult) { object jsonData = ((JsonResult)response).Data; if (jsonData is bool) { return (bool)jsonData ? ValidationResult.Success : new ValidationResult(this.ErrorMessage); } } } } return new ValidationResult(base.ErrorMessageString); } public CustomRemoteValidation(string routeName) : base(routeName) { } public CustomRemoteValidation(string action, string controller) : base(action, controller) { } public CustomRemoteValidation(string action, string controller, string areaName) : base(action, controller, areaName) { } }
#region Fields private const string IranCitiesPath = "~/App_Data/IranCities.xml"; private readonly IUnitOfWork _unitOfWork; private readonly IRentService _rentService; private readonly IInvoiceService _invoiceService; private readonly ISanadService _sanadService; private readonly IContactService _contactService; private readonly IStaffService _staffService; private readonly IProductService _productService; private readonly IApplicationUserManager _userManager; #endregion #region Ctor public RentController(IUnitOfWork unitOfWork, IApplicationUserManager userManager, IRentService rentService, IContactService contactservice , IProductService productservice,IInvoiceService invoiceservice , ISanadService sanadservice, IStaffService staffservice) { _unitOfWork = unitOfWork; _userManager = userManager; _rentService = rentService; _contactService = contactservice; _productService = productservice; _invoiceService = invoiceservice; _sanadService = sanadservice; _staffService = staffservice; }
کاملا متوجه هستم اما چون من از structuremap استفاده می کنم و پارامتر های من service ها برای interface می باشد که در پروژه جاری نمی باشد و نکته مهم من از یه پروژه دیگر (viewmodel) دارم call می کنم نمی تونم پارامتر ها رو ارسال کنم . مشکا اینجاست دقیقا . می خواستم بدونم راه حل شما چیه ؟