Asp.net mvc 通用服务实现
在我学习的ASP.NETMVC4应用程序中,我使用了存储库模式和服务层。项目中使用了实体框架和Autofac。我的数据类很简单,几乎所有的操作都是基本的CRUD操作 我有一个抽象存储库库,如:Asp.net mvc 通用服务实现,asp.net-mvc,dependency-injection,repository-pattern,autofac,Asp.net Mvc,Dependency Injection,Repository Pattern,Autofac,在我学习的ASP.NETMVC4应用程序中,我使用了存储库模式和服务层。项目中使用了实体框架和Autofac。我的数据类很简单,几乎所有的操作都是基本的CRUD操作 我有一个抽象存储库库,如: public abstract class RepositoryBase<T> where T : class 最后,这是我的服务: public interface ISampleService { IEnumerable<Sample1> GetSample1s();
public abstract class RepositoryBase<T> where T : class
最后,这是我的服务:
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我是否需要为每个实体存储库创建单独的类。即,实体样本2的另一个样本2报告
2我可以使用通用服务来执行这些CRUD任务吗
3如果可以提供一般服务。如何在Autofac引导程序中注册它/它们
1我是否需要为每个实体存储库创建单独的类
如果可以,请创建一个通用IRepository实现,并将其映射到此打开的通用接口
2我可以使用通用服务来执行这些CRUD任务吗
当然可以,但真正的问题是:这样做有用吗?在我看来,您的ISampleService只是复制了IRepository中的逻辑。它可能会转发到此存储库。对我来说似乎是一个无用的抽象概念。如果您的应用程序确实是CRUD,则可以将存储库直接注入控制器
3如果可以提供一般服务。如何在中注册它/它们
Autofac引导程序
您可以将开放泛型接口映射到开放泛型实现,如下所示:
builder.RegisterGeneric(typeof(EntityFrameworkRepository<>))
.As(typeof(IRepository<>))
builder.RegisterAssemblyTypes(typeof(IRepository<>).Assembly)
.AsClosedTypesOf(typeof(IRepository<>));
如果您有许多具体的非通用IRepository实现,并希望批量注册它们,则可以按如下方式执行:
builder.RegisterGeneric(typeof(EntityFrameworkRepository<>))
.As(typeof(IRepository<>))
builder.RegisterAssemblyTypes(typeof(IRepository<>).Assembly)
.AsClosedTypesOf(typeof(IRepository<>));
1我是否需要为每个实体存储库创建单独的类
如果可以,请创建一个通用IRepository实现,并将其映射到此打开的通用接口
2我可以使用通用服务来执行这些CRUD任务吗
当然可以,但真正的问题是:这样做有用吗?在我看来,您的ISampleService只是复制了IRepository中的逻辑。它可能会转发到此存储库。对我来说似乎是一个无用的抽象概念。如果您的应用程序确实是CRUD,则可以将存储库直接注入控制器
3如果可以提供一般服务。如何在中注册它/它们
Autofac引导程序
您可以将开放泛型接口映射到开放泛型实现,如下所示:
builder.RegisterGeneric(typeof(EntityFrameworkRepository<>))
.As(typeof(IRepository<>))
builder.RegisterAssemblyTypes(typeof(IRepository<>).Assembly)
.AsClosedTypesOf(typeof(IRepository<>));
如果您有许多具体的非通用IRepository实现,并希望批量注册它们,则可以按如下方式执行:
builder.RegisterGeneric(typeof(EntityFrameworkRepository<>))
.As(typeof(IRepository<>))
builder.RegisterAssemblyTypes(typeof(IRepository<>).Assembly)
.AsClosedTypesOf(typeof(IRepository<>));
我添加了“builder.RegisterGenerictypeofRepositoryBase.AstypeofIRepository;”正如您所建议的,但现在它抛出一个错误序列,该序列在“IContainer container=builder.Build;”上不包含匹配的元素@SherleyDev:这不是一个非常描述性的异常消息:-。我不知道怎么了。尝试更新您的答案并添加此邮件的确切堆栈跟踪。我添加了“builder.RegisterGenerictypeofRepositoryBase.AstypeofIRepository;”正如您所建议的,但现在它抛出一个错误序列,该序列在“IContainer container=builder.Build;”上不包含匹配的元素@SherleyDev:这不是一个非常描述性的异常消息:-。我不知道怎么了。尝试更新您的答案并添加此邮件的确切堆栈跟踪。