5

Obecnie pracuję nad projektem MVC 3, używając Ninject jako mojego DI, obiekty biznesowe są przechowywane w oddzielnym zestawie. Występuje problem z parametrami kontrolera, podczas wysyłania z powrotem do operacji CRUD pojawia się błąd "Nie mogę utworzyć instancji interfejsu". Jestem świadomy, że nie można utworzyć instancji interfejsu, ale wydaje się, że jedynym sposobem, w jaki można to obejść, jest użycie niestandardowego modułu wiążącego model i przejście przez FormCollection. Wydaje się to bardzo nieporządne i chcę zachować tak dużo kodu specyficznego dla danego typu, jak to tylko możliwe - stąd interfejsy wszędzie i Ninject do DI konkrety. Nie tylko nietypowe powiązanie modelu wydaje się kłopotliwe - czy nie stracę również swoich DataAnnotations?Przejmująca jednostka MVC 3 jako interfejs

Niektóre kodu do opisania tego, co mam:

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); 
} 

ktoś napotkasz tego wcześniej? Jak sobie z tym poradziłeś?

Dzięki!

Odpowiedz

3

Dane przekazane do działania kontrolerów są po prostu uchwytami wartości. Nie powinno być w nich żadnej logiki, więc nie ma nic do oddzielenia. Można użyć konkretnych typów (np rekord) zamiast interfejsu (IRecord)

+1

Czy nie złamałbym zasady luźnego sprzężenia? Co, jeśli chcę/muszę zmienić nazwę mojej konkretnej metody z jakiegoś powodu, np. Record staje się RecordDifferent. Mogę mieć RecordDifferent implementujący IRecord i zmienić mój DI, aby teraz wstrzykiwał RecordDifferent we wszystkich przypadkach IRecord. –

+1

Preferuję używać klas dla kontenerów modelu i dziedziczenia zamiast interfejsów. Domyślnie DI nie jest używany do tworzenia obiektów przekazywanych do akcji. Używam DI tylko dla prawdziwej logiki, a nie dla kontenerów danych. – Novakov

+0

Nie do końca rozumiem, co miałeś na myśli, ale postępując nieco z tym projektem, zdałem sobie teraz sprawę, że próbuję "odłączyć" proste kontenery danych, jak powiedziałeś. Nie ma żadnych zachowań (jeszcze) w żadnym z obiektów POCO, które mapują tabelę bazy danych, więc nie ma powodu, aby się z nimi łączyć - ani używać fabryki do ich tworzenia. Domyślam się, że miałem problem ze zrozumieniem, że odsprzęganie powinno być rzeczywiście stosowane do obiektów z zachowaniem, a nie tylko właściwości danych. –

6

ale wydaje się, że tylko w ten sposób można uzyskać wokół tego jest użycie niestandardowego modelu Binder

model niestandardowy spoiwo to właściwa droga. A przy okazji powinieneś używać modeli widoku jako argumentów akcji, a nie modeli domenowych lub interfejsów.

Nie tylko nietypowe powiązanie modelu wydaje się kłopotliwe - czy nie utracę również swoich danych?

Nie wiem, dlaczego uważasz, że niestandardowy segregator do modelowania może spowodować bałagan. Dla mnie jest to świetny sposób na oddzielenie logiki mapowania na klasę wielokrotnego użytku. I nie, nie stracisz DataAnnotations. Będą działać doskonale na konkretnym przykładzie, który powróci niestandardowy segregator modelu.

+1

+1 Oto omówienie niektórych z nich: http://stackoverflow.com/questions/2899680/how-to-use-ninject-or-other-di-ioc-container-with-model-binder- in-asp-ne/2902871 # 2902871 –

+0

Dziękuję za to, czy znasz jakieś praktyczne przykłady, które istnieją za pomocą tego rodzaju rozwiązania? –

+0

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

2

Zrobiłem ten sam prosty błąd. Ninject wstrzykuje parametry do twojego konstruktora, ale dodajesz parametry do akcji kontrolera indeksów.

To powinno wyglądać tak:

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(); 
    } 
} 

sens?

+2

Dzięki, zrobiłem ten sam błąd :( –