2013-04-08 33 views
5

Làm theo hướng dẫn here, nhưng thay vì StructureMap cố gắng sử dụng Ninject.Nhận "MissingMethodException: Không thể tạo một thể hiện của một giao diện" khi ràng buộc giao diện chung với kho lưu trữ với Ninject

Nó ném ra lỗi "MissingMethodException: Không thể tạo trường hợp giao diện" bất kỳ lúc nào tôi cố gắng tiêm một thông số IRepository<SomeEntityType> vào một tham số trong phương thức hành động.

Cập nhật: Cũng không tìm thấy bootstrapper.cs, tôi đã sử dụng gói Ninken Nuget MVC3.

public ActionResult Index(IRepository<SomeEntityType> repo) 
     { 


      return View(); 
     } 

NinjectWebCommon.cs

 private static void RegisterServices(IKernel kernel) 
    { 
     string Cname = "VeraDB"; 
     IDbContext context = new VeraContext("VeraDB"); 
     kernel.Bind<IDbContext>().To<VeraContext>().InRequestScope().WithConstructorArgument("ConnectionStringName", Cname); 
     kernel.Bind(typeof(IRepository<>)).To(typeof(EFRepository<>)).WithConstructorArgument("context",context); 

    }  

IRepository

public interface IRepository<T> where T : class 
{ 
    void DeleteOnSubmit(T entity); 
    IQueryable<T> GetAll(); 
    T GetById(object id); 
    void SaveOrUpdate(T entity); 
} 

EFRepository

public class EFRepository<T> : IRepository<T> where T : class, IEntity 
{ 
    protected readonly IDbContext context; 
    protected readonly IDbSet<T> entities; 

    public EFRepository(IDbContext context) 
    { 
     this.context = context; 
     entities = context.Set<T>(); 
    } 

    public virtual T GetById(object id) 
    { 
     return entities.Find(id); 
    } 

    public virtual IQueryable<T> GetAll() 
    { 
     return entities; 
    } 

    public virtual void SaveOrUpdate(T entity) 
    { 
     if (entities.Find(entity.Id) == null) 
     { 
      entities.Add(entity); 
     } 

     context.SaveChanges(); 
    } 

    public virtual void DeleteOnSubmit(T entity) 
    { 
     entities.Remove(entity); 

     context.SaveChanges(); 
    } 
} 

IEntity chỉ đóng vai trò như một hạn chế chung.

public interface IEntity 
{ 
    Guid Id { get; set; } 
} 
+0

Dòng mã kích hoạt ngoại lệ ở đâu? –

+1

@KirkWoll Như đã nêu, lỗi này sẽ xuất hiện bất cứ khi nào tôi thử chuyển một tham số IRepository vào một phương thức hành động vv. Bây giờ rõ ràng vì Ninject không được cấu hình đúng và không có gì ràng buộc. Có lẽ một cái gì đó để làm với gói MVC3 Nuget không chơi tốt với MVC4. – LaserBeak

+1

Bạn chưa trả lời câu hỏi của tôi. Vui lòng chỉ ra dòng mã đó. –

Trả lời

1

Lỗi loại đó thường cho biết rằng bạn có phiên bản dll khác trong thời gian chạy tới phiên bản bạn đang tham chiếu trong dự án.

Chỉ thử sao chép thủ công tất cả các dll liên quan từ thư mục dự án vào thư mục bin của bạn.

Nếu không, hãy kiểm tra this (thừa nhận, rất cũ) bài cho một số ý tưởng về cách gỡ lỗi sự cố.

+0

Điều này dường như có khả năng nhất, đặc biệt là chúng tôi chưa có stacktrace hoặc tin nhắn đầy đủ được chia sẻ với chúng tôi. –

17

Tôi đã mắc phải sai lầm đơn giản như vậy. Ninject đưa các tham số vào constructor của bạn, nhưng bạn đã thêm các tham số vào hành động của Index Controller.

Nó sẽ giống như thế này:

public class HomeController : Controller 
{ 
    private IRepository<SomeEntityType> _repo; 

    public HomeController(IRepository<SomeEntityType> repo) 
    { 
     _repo= repo; 
    } 

    public ActionResult Index() 
    { 
     ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application. " + 
          _repo.HelloWorld(); 

     return View(); 
    } 
} 

Make ý nghĩa?

+2

Chính xác lỗi tương tự tôi đã làm :) – BoKDamgaard

+0

Tôi cũng vậy, chính xác điều tương tự !! – Luke

+0

Và ... tôi cũng vậy;) Thanx! –

Các vấn đề liên quan