2010-06-15 7 views
0

J'essaie de suivre le tutoriel found here pour implémenter une couche de service dans mon application MVC. Ce que je n'arrive pas à comprendre, c'est comment câbler tout cela.ASP.NET comment implémenter IServiceLayer

Voici ce que j'ai jusqu'ici.

IUserRepository.vb

Namespace Data 
    Public Interface IUserRepository 
     Sub AddUser(ByVal openid As String) 
     Sub UpdateUser(ByVal id As Integer, ByVal about As String, ByVal birthdate As DateTime, ByVal openid As String, ByVal regionid As Integer, ByVal username As String, ByVal website As String) 
     Sub UpdateUserReputation(ByVal id As Integer, ByVal AmountOfReputation As Integer) 
     Sub DeleteUser(ByVal id As Integer) 
     Function GetAllUsers() As IList(Of User) 
     Function GetUserByID(ByVal id As Integer) As User 
     Function GetUserByOpenID(ByVal openid As String) As User 
    End Interface 
End Namespace 

UserRepository.vb

Namespace Data 
    Public Class UserRepository : Implements IUserRepository 
     Private dc As DataDataContext 
     Public Sub New() 
      dc = New DataDataContext 
     End Sub 
#Region "IUserRepository Members" 

     Public Sub AddUser(ByVal openid As String) Implements IUserRepository.AddUser 
      Dim user = New User 
      user.LastSeen = DateTime.Now 
      user.MemberSince = DateTime.Now 
      user.OpenID = openid 
      user.Reputation = 0 
      user.UserName = String.Empty 

      dc.Users.InsertOnSubmit(user) 
      dc.SubmitChanges() 
     End Sub 

     Public Sub UpdateUser(ByVal id As Integer, ByVal about As String, ByVal birthdate As Date, ByVal openid As String, ByVal regionid As Integer, ByVal username As String, ByVal website As String) Implements IUserRepository.UpdateUser 
      Dim user = (From u In dc.Users 
       Where u.ID = id 
       Select u).Single 

      user.About = about 
      user.BirthDate = birthdate 
      user.LastSeen = DateTime.Now 
      user.OpenID = openid 
      user.RegionID = regionid 
      user.UserName = username 
      user.WebSite = website 

      dc.SubmitChanges() 
     End Sub 

     Public Sub UpdateUserReputation(ByVal id As Integer, ByVal AmountOfReputation As Integer) Implements IUserRepository.UpdateUserReputation 
      Dim user = (From u In dc.Users 
         Where u.ID = id 
         Select u).FirstOrDefault 

      ''# Simply take the current reputation from the select statement 
      ''# and add the proper "AmountOfReputation" 
      user.Reputation = user.Reputation + AmountOfReputation 
      dc.SubmitChanges() 
     End Sub 

     Public Sub DeleteUser(ByVal id As Integer) Implements IUserRepository.DeleteUser 
      Dim user = (From u In dc.Users 
         Where u.ID = id 
         Select u).FirstOrDefault 
      dc.Users.DeleteOnSubmit(user) 
      dc.SubmitChanges() 
     End Sub 

     Public Function GetAllUsers() As System.Collections.Generic.IList(Of User) Implements IUserRepository.GetAllUsers 
      Dim users = From u In dc.Users 
         Select u 
      Return users.ToList 
     End Function 

     Public Function GetUserByID(ByVal id As Integer) As User Implements IUserRepository.GetUserByID 
      Dim user = (From u In dc.Users 
         Where u.ID = id 
         Select u).FirstOrDefault 
      Return user 
     End Function 

     Public Function GetUserByOpenID(ByVal openid As String) As User Implements IUserRepository.GetUserByOpenID 
      Dim user = (From u In dc.Users 
         Where u.OpenID = openid 
         Select u).FirstOrDefault 
      Return user 
     End Function 
#End Region 
    End Class 
End Namespace 

IUserService.vb

Namespace Data 
    Interface IUserService 

    End Interface 
End Namespace 

UserService.vb

Namespace Data 
    Public Class UserService : Implements IUserService 

     Private _ValidationDictionary As IValidationDictionary 
     Private _repository As IUserRepository 

     Public Sub New(ByVal validationDictionary As IValidationDictionary, ByVal repository As IUserRepository) 
      _ValidationDictionary = validationDictionary 
      _repository = repository 
     End Sub 

     Protected Function ValidateUser(ByVal UserToValidate As User) As Boolean 
      Dim isValid As Boolean = True 


      If UserToValidate.OpenID.Trim().Length = 0 Then 
       _ValidationDictionary.AddError("OpenID", "OpenID is Required") 
       isValid = False 
      End If 
      If UserToValidate.MemberSince = Nothing Then 
       _ValidationDictionary.AddError("MemberSince", "MemberSince is Required") 
       isValid = False 
      End If 
      If UserToValidate.LastSeen = Nothing Then 
       _ValidationDictionary.AddError("LastSeen", "LastSeen is Required") 
       isValid = False 
      End If 
      If UserToValidate.Reputation = Nothing Then 
       _ValidationDictionary.AddError("Reputation", "Reputation is Required") 
       isValid = False 
      End If 


      Return isValid 
     End Function 

    End Class 
End Namespace 

J'ai aussi câblé le IValidationDictionary.vb et la ModelStateWrapper.vb comme décrit dans l'article ci-dessus.

Ce qui me pose problème, c'est de l'implémenter dans mon contrôleur. Mon contrôleur ressemble à ceci.

Public Class UsersController : Inherits BaseController 
    Private UserService As Data.IUserService 

    Public Sub New() 
     UserService = New Data.UserService(New Data.ModelStateWrapper(Me.ModelState), New Data.UserRepository) 
    End Sub 

    Public Sub New(ByVal service As Data.IUserService) 
     UserService = service 
    End Sub 

    .... 
End Class 

cependant sur la ligne qui dit Public Sub New(ByVal service As Data.IUserService) que je reçois une erreur

'service' ne peut pas exposer type 'Data.IUserService' en dehors du projet par classe 'UsersController'

Donc, ma question est DEUX PARTIES

  1. Comment puis-je implémenter correctement un Serv Couche de glace dans mon application en utilisant les concepts de cet article?
  2. Devrait-il y avoir du contenu dans mon IUserService.vb?

Répondre

2

Essayez d'élaborer une image dans votre esprit du modèle de conception suivant.

Your Controller ---(uses) ----> IUserService 

IUserService ----- (uses) ------> IUserRepository 

Votre contrôleur ne se soucie pas de la mise en œuvre effective (i.e. la classe UserService) ni votre classe UserService de la classe de dépôt réelle.

Pour mémoire, le modèle de conception est Service Interface Pattern

Cela dit tout cela, vous avez deux problèmes à résoudre ce: -

  • D'abord, votre IUserService devrait
    déclarer certains contrats opération
  • Deuxièmement, déclarez votre IUserService comme public

Hope this helps

+0

Ok, donc la deuxième partie était facile. En ce qui concerne le "déclarer certains contrats opérationnels" ... est-ce que les mêmes déclarations que j'ai dans le IUserRepository, ou est-ce quelque chose de différent? Comme je l'ai dit, le tutoriel que j'apprends n'explique pas le IUserService de quelque façon que ce soit. Merci encore. –

+0

Ce serait un début. Mais pensez à déclarer vos contrats d'exploitation comme les services aux utilisateurs que vous voulez exposer au reste du monde. Un exemple serait les opérations CRUD simples (comme AddUser, DeleteUser, UpdateUser, ListUsers). Bonne chance :) – Syd

+0

C'est essentiellement ce que j'ai fait avec UserRepository. La seule différence que je vois est la partie de validation, et si c'est tout ce que je peux, est-ce que je peux tout faire avec le dépôt et oublier la couche de service? –

Questions connexes