在我学习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中注册它们?
答案 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<>));