50٪ تخفیف روی تمام دوره‌ها!
پایان تخفیف تا:
مشاهده دوره‌ها
0

dependency injection in asp.net mvc

سلام

برای ایجاد repository با الگوی di بعد از ساخت اینترفیس و کلاس repository در کنترلر وقتی در سازنده کنترلر از اینترفیس repository استفاده میکنم ارور میده باید چکار کنم؟

از ninject میخوام استفاده کنم

پرسیده شده در 1396/07/16 توسط

5 پاسخ

0

سلام اقای احمدی

code inteface

interface IUserRepository
    {
        User SelectUser(int id);
        IList<User> SelectAll();
        void AddUser(User user);
        void DeleteUser(int id);
        void Save();


    }

code class Repository

public class RepositoryUser : IUserRepository
    {
        private OnlineShopEntities context;
        public RepositoryUser(OnlineShopEntities _context)
        {
            context = _context;
        }
        public User SelectUser(int id)
        {
            return context.Users.Find(id);
        }
        public IList<User> SelectAll()
        {
            return context.Users.ToList();
        }
        public void AddUser(User user)
        {
            context.Users.Add(user);
            Save();
        }
        public void DeleteUser(int id)
        {
            var value = context.Users.Where(i => i.Id == id).FirstOrDefault();
            context.Users.Remove(value);
            Save();

        }
        public void Save()
        {
            context.SaveChanges();
        }
    }

code cotroller

 public class homeController : Controller
    {
          private IUserRepository user;
      
        public homeController(IUserRepository user)
        {
            this.user = user;
        }
        public ActionResult Index()
        {
            return View();
        }
}

code ninject

 public class NinjectControllerFactory : DefaultControllerFactory
    {
        private IKernel ninjectKernel;
        public NinjectControllerFactory()
        {
            ninjectKernel = new StandardKernel();
            addbinding();
        }
        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
        {
            return controllerType == null
                ? null
                : (IController)ninjectKernel.Get(controllerType);
        }
        private void addbinding()
        {
            ninjectKernel.Bind<IUserRepository>().To<UserRepositoy>();
        }
    }

code global.asax

 ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());

error

Inconsistent accessibility: parameter type 'IUserRepository' is less accessible than method 'homeController.homeController(IUserRepository)'

پاسخ در 1396/07/17 توسط
0

ممنون حل شد

فقط یک سوال در کد زیر الگوی dependency injection رعایت نشده درسته؟ چون به کلاس وابسته هست

public class RepositoryUser : IUserRepository
    {
        private OnlineShopEntities context;
        public RepositoryUser(OnlineShopEntities _context)
        {
            context = _context;
        }
        public User SelectUser(int id)
        {
            return context.Users.Find(id);
        }
        public IList<User> SelectAll()
        {
            return context.Users.ToList();
        }
        public void AddUser(User user)
        {
            context.Users.Add(user);
            Save();
        }
        public void DeleteUser(int id)
        {
            var value = context.Users.Where(i => i.Id == id).FirstOrDefault();
            context.Users.Remove(value);
            Save();

        }
        public void Save()
        {
            context.SaveChanges();
        }
    }
پاسخ در 1396/07/17 توسط
1

سلام، خیر مشکلی نداره، شما دارید Dependency رو به صورت Constructor به کلاس مورد نظر پاس میدید و اگر OnlineShopEntities رو به سرویس DI تون اضافه کنید، مشکلی تو گرفتن Instance نخواهید داشت.

پاسخ در 1396/07/19 توسط
0

سلام، دقیقاً چه خطایی دریافت می کنید؟ کدی که برای تنظیمات Ninject نوشتید، کد کنترلر و خطاتون رو اینجا بزارید.

پاسخ در 1396/07/16 توسط
1

سلام مجدد، اینترفیس IUserRepository رو به صورت public تعریف کنید:

public interface IUserRepository
{

}
پاسخ در 1396/07/17 توسط

پاسخ شما