2014-04-09 49 views
-1

比方說,我有一個包含了實現這樣一個接口的各種庫一個LolCats.Data項目:是一個存儲庫實例化一個特定的類型好嗎?

public interface ILolCatRepository 
{ 
    ILolCat Get(Guid id); 
    void Save(ILolCat lolcat); 
    List<ILolCat> GetAll(); 
} 

在獲取(ID)的方法,我需要返回一個類型實現接口的新實例ILolCat。但同時我不想通過做一個返回新的LolCat()來引用LolCat類型。

有什麼辦法,我讓ninject創建類型LolCat我的實例?或者這裏最好的模式是什麼?不知道我是否過度思考這一點。也許這並不重要,因爲存儲庫實例化LolCat,因爲它無論如何返回接口?在另一方面,如果我以某種方式使用Ninject對於這一點,就意味着資源庫將參照具體的IOC容器的解決方案,這可能是壞的。

+0

你有什麼理由將你的實體隱藏在接口後面?您的實體需要抽象出什麼邏輯? – Steven

+0

相關:https://stackoverflow.com/questions/4835046/why-not-use-an-ioc-container-to-resolve-dependencies-for-entities-business-objec – Steven

+0

檢查**選項#2 **從@ raja的回答。它沒有提及IoC特定類型。 –

回答

0

你有幾個選項來避免執行new LocalCat()

選項#1

public class LolCatRepository : ILolCatRepository 
{ 
public ILolCat Get(Guid id) 
{ 
    return NinjectHelper.Resolve<ILolCat>(); 
} 
} 

Ninject的設置如下:

Bind<ILolCat>().To<LolCat>(); 

和助手會是這樣的:

public static class NinjectHelper 
{ 
public static T Resolve<T>() 
{ 
    IKernel kernel = new StandardKernel(); 
    kernel.Load(Assembly.GetExecutingAssembly()); 
    return kernel.Get<T>(); 
} 
} 

選項#2是有點清潔,並使用構造器注入:

public class LolCatRepository : ILolCatRepository 
{ 
public List<ILocalCat> _localCats; 

// ninject will inject this list due to the chain of dependency. 
// if it fails, then go with option #1. 
public LolCatRepository(List<ILocalCat> localCats) 
{ 
    this._localCats = localCats; 
} 

public ILolCat Get(Guid id) 
{ 
    return this._localCats.FirstOrDefault(lc => lc.Id == id); 
} 

// similarly GetAll 
} 
0

當然,你可以有ninject注入的Func<ILolCat> factory進入ILolCatRepository構造。

或者你也可以創建一個接口爲廠家和使用Ninject Factory Extension

IBindingRoot.Bind<ILolCatFactory>().ToFactory(); 

在一個側面說明,爲什麼你實現每一個類型的新資料庫?爲什麼不只是使用如下接口:

public interface IRepository 
{ 
    T Get<T>(Guid id); 

    void Save<T>(T entity); 

    .... 
} 
相關問題