2011-08-29 48 views
1

的方法,这是在C#Repository模式通过添加ADD1实现方法,但应使用基类

public class CategoryRepository: RepositoryBase<Category>, ICategoryRepository 
    { 
    public CategoryRepository(IDatabaseFactory databaseFactory) 
     : base(databaseFactory) 
     { 
     }   
    } 
public interface ICategoryRepository : IRepository<Category> 
{ 
} 

的原代码,我不得不改变它在VB.Net,并把它变成我目前的状况(其他的对象,但主要是相同的),所以它成了这个样子:

Public Class UserRepository 
    Inherits RepositoryBase(Of Domain.Master.User) 
    'Implements IUserRepository 

    Public Sub New(databaseFactory As IDatabaseFactory) 
     MyBase.New(databaseFactory) 
    End Sub 
End Class 


Public Interface IUserRepository 
    Inherits IRepository(Of User) 

End Interface 

的问题是,它仍然有实行IUserRepository,这是不可能的,因为我将不得不重写我的代码,它想要添加已经在RepositoryBase中实现的方法(add,remove,...)

这是我的基类,这里的问题可能是

Public MustInherit Class RepositoryBase(Of T As Class) 

    Private m_masterContext As MyMasterContext 
    Private ReadOnly dbset As IDbSet(Of T) 

    Protected Sub New(databaseFactory__1 As IDatabaseFactory) 
     DatabaseFactory = databaseFactory__1 
     dbset = DataContext.[Set](Of T)() 
    End Sub 

    Protected Property DatabaseFactory() As IDatabaseFactory 
     Get 
      Return m_DatabaseFactory 
     End Get 
     Private Set(value As IDatabaseFactory) 
      m_DatabaseFactory = value 
     End Set 
    End Property 
    Private m_DatabaseFactory As IDatabaseFactory 

    Protected ReadOnly Property DataContext() As MyMasterContext 
     Get 
      Return If(m_masterContext, (InlineAssignHelper(m_masterContext, DatabaseFactory.[Get]()))) 
     End Get 
    End Property 
    Public Overloads Sub Add(entity As T) 
     dbset.Add(entity) 
    End Sub 
    Public Overridable Sub Update(entity As T) 
     dbset.Attach(entity) 
     m_masterContext.Entry(entity).State = EntityState.Modified 
    End Sub 
    Public Overridable Sub Delete(entity As T) 
     dbset.Remove(entity) 
    End Sub 
    Public Overridable Sub Delete(where As Expression(Of Func(Of T, Boolean))) 
     ' Dim objects As IEnumerable(Of T) = dbset.Where(Of T)(where).AsEnumerable() 
     'For Each obj As T In objects 
     ' dbset.Remove(obj) 
     'Next 
    End Sub 
    Public Overridable Function GetById(id As Long) As T 
     Return dbset.Find(id) 
    End Function 
    Public Overridable Function GetById(id As String) As T 
     Return dbset.Find(id) 
    End Function 
    Public Overridable Function GetAll() As IEnumerable(Of T) 
     Return dbset.ToList() 
    End Function 
    Public Overridable Function GetMany(where As Expression(Of Func(Of T, Boolean))) As IEnumerable(Of T) 
     Return dbset.Where(where).ToList() 
    End Function 
    Public Function [Get](where As Expression(Of Func(Of T, Boolean))) As T 
     Return Nothing ' dbset.Where(where).FirstOrDefault(Of T)() 
    End Function 
    Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, value As T) As T 
     target = value 
     Return value 
    End Function 
End Class 

有没有人有一个想法是什么我应该改变让它工作,让我的UserRepository使用方法RepositoryBase而实施IUserRepository?

在此先感谢

回答

0

VB.Net没有直接铸造,contrairy到C#

,最好的办法是重新创建所有的方法和随时调用mybase.method

例如:

Public Overrides Sub Update(entity As Domain.Slave.Klant) Implements Infrastructure.IRepository(Of Domain.Slave.Klant).Update 
     MyBase.Update(entity) 
    End Sub 

所以,这不是在C#中必需的,但它是在VB.Net :)