2009-08-21 11 views
1

Ich bin ein wenig verwirrt über die Service-Schicht und die Verwendung Validierung.Fragen über die Service-Schicht als Validierung in asp.net mvc

Ich suche dieses Tutorial So: http://www.asp.net/learn/mvc/tutorial-38-cs.aspx

zuerst, wenn Sie auf Liste aussehen 3

using System.Collections.Generic; 
using System.Web.Mvc; 

namespace MvcApplication1.Models 
{ 
    public class ProductService : MvcApplication1.Models.IProductService 
    { 

     private ModelStateDictionary _modelState; 
     private IProductRepository _repository; 

     public ProductService(ModelStateDictionary modelState, IProductRepository repository) 
     { 
      _modelState = modelState; 
      _repository = repository; 
     } 

     protected bool ValidateProduct(Product productToValidate) 
     { 
      if (productToValidate.Name.Trim().Length == 0) 
       _modelState.AddModelError("Name", "Name is required."); 
      if (productToValidate.Description.Trim().Length == 0) 
       _modelState.AddModelError("Description", "Description is required."); 
      if (productToValidate.UnitsInStock < 0) 
       _modelState.AddModelError("UnitsInStock", "Units in stock cannot be less than zero."); 
      return _modelState.IsValid; 
     } 

     public IEnumerable<Product> ListProducts() 
     { 
      return _repository.ListProducts(); 
     } 

     public bool CreateProduct(Product productToCreate) 
     { 
      // Validation logic 
      if (!ValidateProduct(productToCreate)) 
       return false; 

      // Database logic 
      try 
      { 
       _repository.CreateProduct(productToCreate); 
      } 
      catch 
      { 
       return false; 
      } 
      return true; 
     } 


    } 

    public interface IProductService 
    { 
     bool CreateProduct(Product productToCreate); 
     IEnumerable<Product> ListProducts(); 
    } 
} 

Sie gleiche Schnittstelle nur mit einem anderen Namen, warum im Grunde nicht nur eine verwenden?

public interface IProductRepository 
    { 
     bool CreateProduct(Product productToCreate); 
     IEnumerable<Product> ListProducts(); 
    } 

    public interface IProductService 
    { 
     bool CreateProduct(Product productToCreate); 
     IEnumerable<Product> ListProducts(); 
    } 

In meinem Buch aber (der Autor, denke ich schrieb dieses Tutorial) hat sie sich verändert IProductRepository müssen erlöschen. Das verwirrt mich noch mehr.

Also kann jemand erklären, warum ich 2 Schnittstellen brauche, die das gleiche zu tun scheinen?

Meine nächste Frage ist, mein Repository hat eine Löschfunktion. Setze ich dieses auch in meine Service-Ebene (ich denke, obligatorisch, wenn Sie eine Schnittstelle verwenden, aber wenn Sie 2 wie etwa verwenden, dann könnte es optional sein).

Also was hätte ich in meiner Serviceebene? Wäre es nur Löschen Funktion im Repository? Sollte es nur eine leere Methode sein oder sollte es bool zurückkehren? Ich denke nicht, dass für diese Methode eine Validierung erforderlich wäre.

So bin ich mir nicht sicher, ob ein Bool benötigt würde.

Antwort

1

aus dem Tutorial Sie lesen sind:

So Anwendungsfluss Steuerlogik in einem Controller und Daten gehören Zugriffslogik in einem Repository gehört. In diesem Fall, wo setzen Sie Ihre Validierungslogik? Eine Option ist Platzieren Sie Ihre Validierungslogik in einer Serviceebene.

Eine Serviceschicht ist eine zusätzliche Schicht in einer ASP.NET MVC-Anwendung, die die Kommunikation zwischen einem Controller und Repository-Schicht vermittelt. Die Serviceschicht enthält Geschäftslogik. Insbesondere enthält es Validierung Logik.

EDIT:

Ich bin nicht sicher, ob ich es Ihnen in einer klaren Art und Weise erklären kann (weil ich auf Englisch nicht fließend bin), aber ich werde versuchen:

A Serviceschicht ist eine zusätzliche Schicht in einer ASP.NET MVC-Anwendung, die die Kommunikation zwischen einer Controller- und einer Repository-Schicht vermittelt, da Sie sowohl die Validierung als auch die Anwendung verwalten können. Manchmal muss der Dienst mit zwei oder mehr Methoden des entsprechenden Repository-Layers arbeiten, so dass er nicht dieselbe Schnittstelle haben muss.

Ein einfaches Beispiel, lassen Sie uns glauben, Sie haben ein Registrierungsformular.

haben Sie folgende Schnittstellen

public interface IUserService 

{ 
    bool Register(User mUser); 
    bool Validate(User mUser); 
} 

public interface IUserRepository 
{ 
    User FindUserByEmail(string Email); 
    bool Insert(User mUser); 
} 

so werden Sie mit zwei Klasse am Ende so etwas wie tun: public class UserRepository: IUserRepository {

User FindUserByEmail(string Email) 
{ 
    //do a ninja search and return an user or null 
} 
    bool Insert(User mUser); 
    { 
     //Insert user into db 
    } 
} 

public class UserService: IUserService 
{ 
    public bool Validate(User mUser) 
    { 
     //validate user 
    } 
    IUserRepository _respository = new UserRepository(); 
    bool Register(User mUser) 
    { 
     if(Validate(mUser); 
     var hasUser = _respository.FindUserByEmail(User.Email); 
     if(hasUser==null) 
      return _respository.Insert(mUser); 
     return false; 
    } 
} 
+0

Sorry, ich folge nicht. Ich verstehe immer noch nicht, warum Sie nicht dieselbe Schnittstelle verwenden können und stattdessen zwei verschiedene Schnittstellen mit genau denselben Methoden erstellen. Immer noch nicht sicher über das Löschen eines sollte es entweder etwas zurückgeben oder nicht? – chobo2

+0

chobo2, ich habe meine Antwort bearbeitet, um zu erklären, was es für dich bedeutet (es ist so lange Zeit von mir, LOL aufzuschreiben) – Cleiton

+0

Das hilft viel. Wie wäre es, wenn Sie ein anderes Repository aufrufen müssen? Würdest du es in der Serviceebene nennen oder würdest du es in deinem Controller nennen? – chobo2

0

Ich glaube, Sie haben hat in diesem begrenzten Fall ein Argument für eine einzelne Schnittstelle erstellt, aber der Dienst und die Repositorys führen zwei sehr unterschiedliche Funktionen aus, und es kann zu Problemen kommen, wenn sie eine einzelne Schnittstelle gemeinsam nutzen.

Was ist, wenn CreateProduct() oder ListProducts() unterschiedliche Methodensignaturen im Service oder im Repository benötigen?

Was wäre, wenn ValidateProduct() in der Schnittstelle definiert werden sollte? Das Repository sollte dies sicherlich nicht umsetzen müssen.

Wie Sie gesagt haben, gibt es keine Notwendigkeit für zwei Schnittstellen, die das gleiche in diesem speziellen Beispiel definieren, aber ich nehme an, der Autor geht davon aus, dass sie später anders und daher notwendig sein würden.

+0

Hmm Ich sehe Ihren Punkt irgendwie, aber ich denke, ich würde mehr von einem Beispiel benötigen. Ich versuche zu denken, warum CreateProduct eine andere Methodensignatur haben würde. So wie sich die Service-Schicht entweder mit dem Repository verbindet oder wenn Sie ein Produkt erstellen möchten, muss es die Felder enthalten, die der Datenbank entsprechen. Ich sehe also nicht, was CreateProduct jemals in einem Produkt, das mit diesen Feldern erstellt werden muss, anders senden würde. – chobo2

+0

Auf einer Seite nicht das Beispiel, das er in seinem Buch gibt (ich denke, dass Tutorial wurde von dem Typen geschrieben, der asp.net mvc entfesselt geschrieben). Er hat nicht einmal ein ValidateProduct(). Er hat die Validierung direkt in der Create-Methode durchgeführt. – chobo2

+0

Ich habe den Code zuerst falsch gelesen (Validate ... ist eine geschützte Methode, die nur in der Create-Methode aufgerufen wird), weshalb sie in diesem Fall nicht in der Schnittstelle wäre. Der Unterschied zwischen seinem Buch und diesem ist nur ein wenig Refactoring. –

Verwandte Themen