通用服务实现

时间:2013-02-28 16:02:26

标签: asp.net-mvc dependency-injection repository-pattern autofac

在我学习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 bootstrapper中注册它们?

1 个答案:

答案 0 :(得分: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<>));