【问题标题】:Generic Service Implementation通用服务实现
【发布时间】:2013-02-28 16:02:26
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    3) 如果通用服务是可能的。我怎样才能注册它/他们 Autofac 引导程序?

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

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

    如果您有许多具体的(非通用的)IRepository&lt;T&gt; 实现并希望批量注册它们,您可以按如下方式进行:

    builder.RegisterAssemblyTypes(typeof(IRepository<>).Assembly)
        .AsClosedTypesOf(typeof(IRepository<>));
    

    【讨论】:

    • 我添加了 'builder.RegisterGeneric(typeof(RepositoryBase)).As(typeof(IRepository));'正如你所建议的那样,但现在它在'IContainer container = builder.Build();'上抛出错误“Sequence contains no matching element”
    • @SherleyDev:这不是一个非常具有描述性的异常消息 :-(。我不知道出了什么问题。尝试更新您的答案并添加此消息的确切堆栈跟踪。
    猜你喜欢
    • 2020-01-21
    • 2018-09-19
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    相关资源
    最近更新 更多