2013-12-07 31 views
0

我試圖使用某些接口和工廠模式將Dal與Bll解耦。 包含接口的Data.Contracts將在我的Bll中引用。使用工廠模式解耦Dal存儲庫

這是一個小的測試代碼:

class Program 
{ 
    static void Main(string[] args) 
    { 
     IDataRepositoryFactory _DataRepositoryFactory; 
     IUserRepository userRepository = _DataRepositoryFactory.GetDataRepository<IUserRepository>(); 
    } 
} 


public abstract class RepositoryBase<T> where T : class, new() { } 
public class UserRepository : RepositoryBase<User>, IUserRepository 
{ 
    public UserRepository() { } 
} 

public class DataRepositoryFactory : IDataRepositoryFactory 
{ 
    public T GetDataRepository<T>() where T : IDataRepository, new() 
    { 
     return ObjectBase.Container.GetExportedValue<T>(); 
    } 
} 

public class User 
{ 
    public int Id { get; set; } 
} 

public abstract class ObjectBase 
{ 
    public ObjectBase() { } 

    public static CompositionContainer Container { get; set; } 

} 

public interface IDataRepository { } 

public interface IDataRepository<T> : IDataRepository where T : class, new() { } 

public interface IUserRepository : IDataRepository { } 

public interface IDataRepositoryFactory 
{ 
    T GetDataRepository<T>() where T : IDataRepository, new(); 
} 

的最後我得到了我的錯誤:

「Data.Contracts.IUserRepository」必須是非抽象類型,以便公衆參數構造函數 了一般類型或方法使用它作爲參數「T」「Data.Contracts.IDataRepositoryFactory.GetDataRepository()」

我的問題是: 哪個是正確的I實現使用工廠模式解耦業務層上的代碼? 我不能使用具體的實現UserRepository,因爲它繼承了BLL中我不想要的類。

任何幫助,將不勝感激。

回答

0

從代碼的角度你應該禁止出廠界面上的「新」的約束:

public interface IDataRepositoryFactory 
{ 
    T GetDataRepository<T>() where T : IDataRepository; //, new(); 
} 

public class DataRepositoryFactory : IDataRepositoryFactory 
{ 
    public T GetDataRepository<T>() where T : IDataRepository//, new() 
    { 
     return ObjectBase.Container.GetExportedValue<T>(); 
    } 
} 

從視圖存儲庫的設計點看起來有點複雜:

對於我來說IDataRepository(非泛型)和RepositoryBase似乎是多餘的,但這取決於具體情況(可能你沒有提供足夠的詳細信息ILS)。我會用IDataRepository<T> -> IUserRepository:IDataRepository<User> -> UserRepository繼承鏈。

此外,還不清楚哪些類型屬於BLL。

例如,此故障看起來沒事對我說:

  • BLL:
    • User
    • IUserRepository:IDataRepository<User>
  • DAL /基礎設施:
    • IDataRepositoryFactory
    • IDataRepositoryFactory:IDataRepositoryFactory
    • IDataRepository<T>
    • UserRepository

一般來說,我會建議簡化代碼結構和最簡單的方式開始,然後添加新的接口/類當你真的需要他們。

+0

謝謝,我在我的實現中發現了一個不起作用的約束,我用一個更簡單的模型和DI重建了一個小控制檯應用程序並解決了。 – MyOwnWay