Asp.net mvc 通用服务实现

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();

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

我有一个抽象存储库库,如:

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:这不是一个非常描述性的异常消息:-。我不知道怎么了。尝试更新您的答案并添加此邮件的确切堆栈跟踪。