dependency injection in asp.net mvc
سلام
برای ایجاد repository با الگوی di بعد از ساخت اینترفیس و کلاس repository در کنترلر وقتی در سازنده کنترلر از اینترفیس repository استفاده میکنم ارور میده باید چکار کنم؟
از ninject میخوام استفاده کنم
5 پاسخ
سلام اقای احمدی
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)'
ممنون حل شد
فقط یک سوال در کد زیر الگوی 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(); } }
سلام، خیر مشکلی نداره، شما دارید Dependency رو به صورت Constructor به کلاس مورد نظر پاس میدید و اگر OnlineShopEntities رو به سرویس DI تون اضافه کنید، مشکلی تو گرفتن Instance نخواهید داشت.
سلام، دقیقاً چه خطایی دریافت می کنید؟ کدی که برای تنظیمات Ninject نوشتید، کد کنترلر و خطاتون رو اینجا بزارید.
سلام مجدد، اینترفیس IUserRepository رو به صورت public تعریف کنید:
public interface IUserRepository { }