1

在我學習ASP.NET MVC 4應用程序中,我使用了存儲庫模式和服務層。項目中使用了實體框架和Autofac。我的數據類很簡單,幾乎所有的操作都是基本的CRUD操作。通用服務實現

我有一個抽象的倉庫基地:

public abstract class RepositoryBase<T> where T : class 

這是爲實體樣本1樣本庫:

public class Sample1Repository : RepositoryBase<Sample1>, ISample1Repository 
    { 
     public Sample1Repository(IDatabaseFactory databaseFactory) 
      : base(databaseFactory) 
     { 
     } 
    } 

    public interface ISample1Repository : IRepository<Sample1> 
    { 
    } 

這是我的控制器:

public class SampleController : Controller 
{ 
    private readonly ISampleService _sampleService; 

    public SampleController(ISampleService sampleService) 
    { 
     this._sampleService = sampleService; 
    } 
} 

而且,最後這是我的服務:

public interface ISampleService 
{ 
    IEnumerable<Sample1> GetSample1s(); 
    Sample1 GetSample1(int id); 
    void CreateSample1(Sample1 item); 
    void DeleteSample1(int id); 
    void SaveSample1(); 
} 

public class SampleService : ISampleService 
{ 
    private readonly ISample1Repository _sample1Repository; 

    private readonly IUnitOfWork _unitOfWork; 

    public SampleService(ISample1Repository sample1Repository, IUnitOfWork unitOfWork) 
    { 
     this._sample1Repository = sample1Repository; 
     this._unitOfWork = unitOfWork; 
    } 
} 

現在,我有以下問題:

1)我需要創建一個單獨的類爲每個實體存儲庫。 (即實體Sample2的另一個Sample2Repository)

2)我可以使用通用服務來執行這些CRUD任務嗎?

3)如果通用服務是可能的。我如何在Autofac bootstrapper中註冊它們?

回答

3

1)是否需要爲每個實體存儲庫創建一個單獨的類。

如果可以,請創建一個通用IRepository<T>實現並將其映射到此開放式通用接口。

2)我可以使用通用服務來完成這些CRUD任務嗎?

當然可以,但真正的問題是:這樣做有用嗎?在我看來,你的ISampleService只是複製IRepository<T>的邏輯。它可能會轉發到這個存儲庫。對我來說似乎是無用的抽象。如果您的應用程序真的是CRUD,那麼您可以直接將您的存儲庫注入到控制器中。

3)如果通用服務是可能的。我如何在 Autofac bootstrapper中註冊它們?

可以按如下方式的開放式通用接口映射到一個開放的通用實現:

builder.RegisterGeneric(typeof(EntityFrameworkRepository<>)) 
    .As(typeof(IRepository<>)) 

如果你有很多具體的(非通用)IRepository<T>實現和若想批量註冊它們,你可以這樣做如下:

builder.RegisterAssemblyTypes(typeof(IRepository<>).Assembly) 
    .AsClosedTypesOf(typeof(IRepository<>)); 
+0

我添加了'builder.RegisterGeneric(typeof(RepositoryBase <>))。(typeof(IRepository <>));'正如你所建議的,但是現在它會在'IContainer container = builder.Build();'上拋出一個錯誤「Sequence contains no matching element」 – SherleyDev 2013-02-28 19:36:05

+0

@SherleyDev:這不是一個非常具有描述性的異常消息:-(。我不知道什麼是錯的,嘗試更新你的答案並添加這條消息的確切堆棧跟蹤。 – Steven 2013-02-28 20:04:04