2013-03-26 57 views
0

我正在按照Repository PatternUnit Of Work模式的組合使用教程。工作模式單元 - 使用工廠獲取軟件倉庫

我主要有:以上

interface IRepository<T> where T : class 
{ 
    //... 
} 
class Repository<T> where T : class 
{ 
    //Implemented methods 
} 
interface IFooRepository 
{ 
    IQueryable<Foo> GetFoos(); 
} 
class FooRepository : Repository<Foo>, IFooRepository 
{ 
    IQueryable<Foo> GetFoos() {} 
} 

代表我的repositories,在基本意義。然後我有一個Uow類。

public class MyUow 
{ 
    public void Commit() { } 
    public IRepository<Bar> Bars { get { return GetStandardRepo<Bar>(); } } 
    public IFooRepository Foos { get { return GetRepo<IFooRepository>(); } } 
    private IRepository<T> GetStandardRepo() 
    { 
    return RepositoryProvider.GetRepoistoryForEntityType<T>(); 
    } 
    private T GetRepo<T>() 
    { 
    return RepositoryProvider.GetRepository<T>(); 
    } 
} 

我的問題是即將在那裏我下面只有永遠的教程instansiates在RepositoryProviderDictionairy<Type, object>和似乎並沒有坐滿,所以在使用的方法是行不通的。

public virtual T GetRepository<T>(Func<DbContext, object> factory = null) where T : class 
{ 
    //Look for T in the dictionairy by typeof(T) 
    object repoObj; 
    Repositories.TryGetValue(typeof(T), out repoObj); 
    if (repoObj != null) 
    return (T)repoObj; 
    //Not found or a null value, make a new instance of the repository. 
    return MakeRepository<T>(factory, Context); 
} 
private T MakeRepository<T>(Func<DbContext, object> factory, DbContext dbContext) where T : class 
{ 
    var f = factory ?? _repositoryFactories.GetRepositoryFactory<T>(); 
    if (f == null) 
    //Exception here because this is null 
    throw new NotImplementedException("No factory for repository type"); 
    var repo = (T)f(dbContext); 
    Repositories[typeof(T)] = repo; 
    return repo; 
} 

我的問題基本上是什麼正確的方式來實現這種模式,我哪裏出錯了?我應該使用已知存儲庫列表來創建Dictionairy<Type, Func<DbContext, object>嗎?這看起來很髒。我瘋狂地試圖解決這個問題!

在此先感謝。

+0

什麼一個回合的鏈接教程 – Tar 2013-03-26 16:08:27

+0

@Tar這只是一個輔助類在'Pluralsight'上,所以大多數人都無法訪問它。 – LukeHennerley 2013-03-26 16:22:14

+0

我會說,如果你不能根據教程構建一個示例解決方案,那麼這是一個糟糕的教程。 這個問題本身有點虛擬,不容易回答... – Tar 2013-03-26 20:17:12

回答

0

我從一開始看到的是,你的Repository<T>沒有實現IRepository<T>,所以它應該是這樣的:

class Repository<T> : IRepository<T> where T : class 
{ 
    //Implemented methods 
} 

那麼你完全保密的教程,應該說明怎樣_repositoryFactories.GetRepositoryFactory<T>()可以發現你的IRepository<T>實施者FooRepository - 也許它會自動發現,也許你需要在某處註冊某些東西。

接下來,我又一無所知您的具體教程和工廠等,但我想你可能需要使用GetRepo<Foo>代替GetRepo<IFooRepository>,因爲現在這個IFooRepository看起來毫無意義的...也許再錯過這個IFooRepository東西聲明,它應該像interface IFooRepository : IRepository<Foo> - 再一次,它很大程度上取決於您正在使用的工廠的特定發現實現。

+0

積分:1。我的問題不在於存儲庫,他們很好。 2.本教程不是「*祕密*」,它是一個支付服務的Pluralsight。如果您有權訪問它,請隨時前往觀看。 3.爲什麼使用界面毫無意義?具體類型的使用意義較小。接口允許依賴注入。 4.問題本身涉及一組特定的模式,而不是我的代碼。該代碼只是一個主要縮小的例子,用一小撮鹽:) – LukeHennerley 2013-03-26 17:00:32

+0

1.。GetRepositoryFactory 無法被發現 - 所以也許不如你想象的那樣好 2. http://www.esreality.com /files/placeimages/2009/71946-SarcasmSign.jpg 3.我不談論OOP的概念 - 我只是說從問題的角度來看,這個特定的接口是沒有意義的。 4.模式沒問題。代碼不是。所以我們必須談論代碼:) – Lanorkin 2013-03-26 19:49:12

0

如果你還沒有找到答案,我按照教程,並能夠運行它(教程示例)。如果你確定你已經實現了它,請注意這一點,

存儲庫字典默認爲空,並且只有在第一次請求時纔會有非標準回購(例如IFooRepository)的值。因此,如果您正在檢查Repository Dictionary的調試中的值,並且尚未請求IFooRepository,則肯定不會在那裏看到它。有一個代碼首先訪問IFooRepository,然後它將在提供者類的MakeRepository方法中爲該庫創建一個存儲庫。

希望幫助

0

有一個叫RepositoryFactories.cs 您需要爲您的自定義庫的字典添加一個條目

{typeof(IFooRepository), dbContext => new FooRepository (dbContext)}