ASP.NET كيفية تنفيذ iservicelayer
-
27-09-2019 - |
سؤال
أحاول اتباع البرنامج التعليمي وجدت هنا لتنفيذ طبقة خدمة في تطبيق MVC الخاص بي. ما لا يمكنني اكتشافه هو كيفية توصيل كل شيء.
هذا ما لدي حتى الآن.
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
لقد قمت أيضًا بتوصيل ivalidationDictionary.vb و ال ModelStateWrapper.vb كما هو موضح في المقالة أعلاه.
ما أواجه مشكلة معه هو تنفيذها بالفعل في وحدة التحكم الخاصة بي. وحدة التحكم الخاصة بي تبدو مثل هذا.
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
لكن على الخط الذي يقول Public Sub New(ByVal service As Data.IUserService)
أحصل على خطأ
لا يمكن "الخدمة" فضح البيانات ".
لذا سؤالي هو جزأين
- كيف يمكنني تنفيذ طبقة خدمة بشكل صحيح في طلبي باستخدام المفاهيم من هذه المقالة؟
- هل يجب أن يكون هناك أي محتوى داخل بلدي iuserservice.vb?
المحلول
حاول وضع صورة في عقلك لنمط التصميم التالي.
Your Controller ---(uses) ----> IUserService
IUserService ----- (uses) ------> IUserRepository
لا تهتم وحدة التحكم الخاصة بك بالتنفيذ الفعلي (أي فئة userviceervice) أو فئة المستخدمين الخاصة بك من فئة المستودع الفعلي.
للسجل ، نمط التصميم هو نمط واجهة الخدمة
بعد قول كل هذه ، لديك مشكلتان لإصلاح هذا:-
- أولا ، يجب أن يكون iuserservice
أعلن بعض عقود العملية - ثانياً ، أعلن عن خرف iuserservice الخاص بك كجمهور
أتمنى أن يساعدك هذا