2013-04-02 16 views
0

我有我的同事繼承的業務邏輯操作的基類。這個類暴露了一個構造函數,它需要一個objectContext作爲參數。您可以將此基類視爲原子CRUD操作的組件(其所有select,insert,edit和delete方法將始終只對一個實體起作用)。對象共享和動態實例創建

然後,我有一個「超類」,其主要目的是在上述所有基類之間共享objectContext以執行某些業務事務,並且必須提供任何baseClass實例。

所以,我在找一個優雅的方式來「注入」超類的objectContextbaseclass

public BaseClass<T> where T : entity 
{ 
    private ObjectContext _ctx; 
    public BaseClass(ObjectContext ctx){ _ctx = ctx;} 
    public virtual IList<T> Select(){..} 
    public cirtual voind Insert(T entity){..} 
    // other stuff 
} 

public class SuperClass 
{ 
    private ObjectContext _ctx = new... 
    public BaseClass<TEntity> LoadBaseClass(TBase, TEntity) where TBase : BaseClass<TEntity>, where TEntity : class 
    { 
     BaseClass<TEntity> obj = Activator.CreateInstance(typeof(TBase), _ctx); // share objectContext 
    } 
    public int SaveAll(){return _ctx.SaveChanges();} 
} 

正如你看到的,我的超類是能夠通過其類型,返回一些baseClass實例,這正是我想要的。但是,如果某些繼承類使用其他參數定義自己的構造函數,則我的方法將失敗。

我會找到一個乾淨的解決方案,以避免從LoadBaseClass方法實例創建期間出現任何錯誤的可能性。我知道的唯一方法是定義一個私人構造器,但通過這種方式,沒有人能夠繼承baseclass了。

回答

2

你在找什麼叫Dependency Injection。你現在正試圖手動建立這個,但有很多工具已經做到了你想要的。

依賴注入是關於構造對象和配置如何以及何時創建這些對象的。它歸結爲從業務邏輯中分離對象創建。

就你而言,你正在使用一種叫做Unit Of WorkRepository模式的東西。使用依賴注入容器像Ninject您可以輕鬆地配置UnitOfWork所有倉庫之間共享這樣的:

var kernel = new StandardKernel(); 
kernel.Bind<IMyRepository>().To<ConcreteRepository(); 
kernel.Bind<IMyUnitOfWork>().To<ObjectContextImp>().InRequestScope(); 

IMyRepository repos = kernel.Get<IMyRepository>(); 

什麼Ninject(或任何DI工具)需要做的是試圖建立一個IMyRepository。您已將其配置爲查找ConcreteRepository。然後它注意到ConcreteRepository在其構造函數中採用IMyUnitOfWork。在這種情況下,您已將其映射到您的ObjectContextIml並添加了InRequestScope選項。

InRequestScope適用於ASP.NET Web應用程序,這意味着您的上下文應該爲每個請求創建一次。 Ninject有幾個不同的Object Scopes,您可以使用它們來配置應該如何創建和共享對象。

這樣,您就完全控制了對象的創建方式。

+0

這是不可能完成我的應用程序。我的應用程序有點複雜,你怎麼想象..我在不同的數據庫上使用多個objectContex,我希望讓同事免費構建UnitOfWork和商業類,他們更喜歡。 – bit

+0

依賴注入用於各種應用程序,但主要用於更復雜的應用程序。使用您當前的解決方案,您正嘗試構建一些依賴注入容器已經爲您完成的工作。我強烈建議您閱讀一些DI文檔,以確保它不符合您的需求。 –

+0

當然,DI可能是許多情況下的一個很好的解決方案,但我認爲它不適合我的情況。我會記住你,ObjectContext不一定在businessClass之間共享。事實上BL類可以自己生活。共享需求只取決於我的同事建立他們的邏輯。我想要做的是爲原子核和交易操作提供一個「基礎」組件。 – bit