1

在我学习 ASP.NET MVC 4 应用程序中,我使用存储库模式和服务层。项目中使用了实体框架和 Autofac。我的数据类很简单,几乎所有的操作都是基本的 CRUD 操作。

我有一个抽象的存储库库:

public abstract class RepositoryBase<T> where T : class

这是实体 Sample1 的示例存储库:

   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 引导程序中注册它/它们?

4

1 回答 1

4

1)我是否需要为每个实体存储库创建一个单独的类。

如果可以,创建一个通用IRepository<T>实现并将其映射到这个开放的通用接口。

2)我可以使用通用服务来完成这些 CRUD 任务吗?

当然可以,但真正的问题是:这样做有用吗?在我看来,您ISampleService只是复制了IRepository<T>. 它可能会转发到这个存储库。对我来说似乎是一个无用的抽象。如果您的应用程序是真正的 CRUD,您可以将存储库直接注入您的控制器。

3) 如果通用服务是可能的。我如何在 Autofac 引导程序中注册它/它们?

您可以将开放通用接口映射到开放通用实现,如下所示:

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

如果您有许多具体(非通用)IRepository<T>实现并希望批量注册它们,您可以按如下方式执行此操作:

builder.RegisterAssemblyTypes(typeof(IRepository<>).Assembly)
    .AsClosedTypesOf(typeof(IRepository<>));
于 2013-02-28T16:18:56.893 回答