5

Tôi hiện đang làm việc trên một dự án MVC 3 sử dụng Ninject làm DI của tôi, các đối tượng nghiệp vụ được lưu trữ trong một hội đồng riêng biệt. Tôi đang chạy vào một vấn đề với các thông số điều khiển, khi đăng lại cho các hoạt động CRUD tôi nhận được lỗi "Không thể tạo ra một thể hiện của một giao diện". Tôi biết rằng bạn không thể tạo ra một thể hiện của một giao diện, nhưng nó có vẻ như cách duy nhất tôi có thể có được xung quanh này là sử dụng một mô hình tùy chỉnh chất kết dính và vượt qua FormCollection thông qua. Điều này có vẻ thực sự lộn xộn và tôi muốn giữ nhiều loại mã cụ thể ra khỏi dự án như tôi có thể - do đó giao diện ở khắp mọi nơi và Ninject đến DI concretes. Việc ràng buộc mô hình tùy chỉnh không chỉ có vẻ lộn xộn - tôi cũng sẽ không mất DataAnnotations của mình?Thực thể chuyển MVC 3 làm Giao diện

Một số mã để mô tả những gì tôi có:

public ActionResult Create() 
{ 
    // I'm thinking of using a factory pattern for this part 
    var objectToCreate = new ConcereteType(); 
    return (objectToEdit); 
} 

[HttpPost] 
public ActionResult Create(IRecord record) 
{ 
    // check model and pass to repository 
    if (ModelState.IsValue) 
    { 
     _repository.Create(record); 
     return View(); 
    } 

    return View(record); 
} 

Có ai chạy vào trong này trước đây chưa? Làm thế nào bạn vượt qua nó?

Cảm ơn!

Trả lời

3

Dữ liệu được truyền cho hoạt động của bộ điều khiển chỉ đơn giản là giá trị cho các giá trị. Không nên có bất kỳ logic trong họ vì vậy không có gì để decouple từ. Bạn có thể sử dụng các loại bê tông (ví dụ Record) thay vì giao diện (IRecord)

+1

Tôi sẽ không phá vỡ quy tắc khớp nối lỏng lẻo? Điều gì sẽ xảy ra nếu tôi muốn/phải thay đổi tên của phương pháp cụ thể của mình vì một lý do nào đó tức là Bản ghi trở thành RecordDifferent. Tôi có thể có RecordDifferent thực hiện IRecord và thay đổi DI của tôi để bây giờ tiêm RecordDifferent trong mọi trường hợp của IRecord. –

+1

Tôi đặt trước để sử dụng các lớp cho vùng chứa mô hình và kế thừa hơn là giao diện. Theo mặc định, DI không được sử dụng để tạo các đối tượng được truyền cho các hành động. Tôi không sử dụng DI chỉ vì logic thực sự không phải cho các thùng chứa dữ liệu – Novakov

+0

Không thực sự hiểu ý của bạn ban đầu, nhưng đã tiến triển một chút với dự án này, bây giờ tôi nhận ra rằng tôi đang cố gắng "tách" các thùng chứa dữ liệu đơn giản như bạn đã nói. Không có hành vi (chưa) trong bất kỳ đối tượng POCO nào ánh xạ một bảng cơ sở dữ liệu và do đó không có lý do gì để giao tiếp với các đối tượng này - cũng như không sử dụng một nhà máy để khởi tạo chúng. Tôi đoán những gì tôi đã có sự hiểu biết vấn đề là tách nên thực sự được sử dụng cho các đối tượng có hành vi hơn là chỉ các thuộc tính dữ liệu. –

6

nhưng nó có vẻ như cách duy nhất tôi có thể làm được việc này là sử dụng một mô hình tùy chỉnh chất kết dính

Một mô hình tùy chỉnh chất kết dính là cách chính xác để đi. Và bằng cách này bạn nên sử dụng các mô hình xem như các đối số hành động, không phải là các mô hình miền hoặc các giao diện.

Không chỉ ràng buộc mô hình tùy chỉnh có vẻ lộn xộn - tôi cũng sẽ không mất các chú thích dữ liệu của mình?

Tôi không biết tại sao bạn nghĩ rằng một chất kết dính mô hình tùy chỉnh sẽ làm mọi thứ lộn xộn. Đối với tôi, đó là một cách tuyệt vời để tách logic lập bản đồ thành một lớp có thể sử dụng lại được. Và, không, bạn sẽ không mất DataAnnotations. Họ sẽ làm việc hoàn toàn tốt đẹp trên trường hợp cụ thể mà các mô hình tùy chỉnh chất kết dính sẽ trở lại.

+1

+1 Dưới đây là một số điểm: http://stackoverflow.com/questions/2899680/how-to-use-ninject-or-other-di-ioc-container-with-the-model-binder- in-asp-ne/2902871 # 2902871 –

+0

Cảm ơn điều đó, bạn có biết bất kỳ ví dụ thực tế nào tồn tại bằng cách sử dụng loại giải pháp này không? –

+0

@ PaulAldred-Bann http://msdn.microsoft.com/en-us/magazine/hh781022.aspx – fordareh

2

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 IRecord _record; 

    public HomeController(IRecord record) 
    { 
     _record = record; 
    } 

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

     return View(); 
    } 
} 

Make ý nghĩa?

+2

Cảm ơn, tôi đã làm sai tương tự :( –