在asp.net-mvc中,是否有更优雅的方式使用IOC将多个存储库注入控制器?

leo*_*ora 1 asp.net-mvc dependency-injection ninject repository inversion-of-control

我有一个asp.net-mvc网站,我正在使用ninject for IOC和nhibernate用于我的ORM映射

这是我的IOC绑定代码:

internal class ServiceModule : NinjectModule
{
    public override void Load()
    {
        Bind(typeof(IIntKeyedRepository<>)).To(typeof(Repository<>)).InRequestScope();
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是我如何将IOC用于控制器代码的示例:

    public FAQController(IIntKeyedRepository<FAQ> faqRepository, IUnitOfWork unitOfWork)
    {
        _faqRepository = faqRepository;
        _unitOfWork = unitOfWork;
    }
Run Code Online (Sandbox Code Playgroud)

问题是到目前为止,每个控制器都有一个它指向的表,所以我只需要传递给它的存储库类...

现在,我有许多表和类都只有2个字段:

  • ID
  • 名称

对于这些类中的每一个,我只是从一个名为的基类继承:

 BaseModel
Run Code Online (Sandbox Code Playgroud)

这只是:

public class BaseModel
{
    public virtual string Name { get; set; }
    public virtual int Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想要一个:

 StaticDataController
Run Code Online (Sandbox Code Playgroud)

可以为从BaseModel继承的每个类执行所有CRUD的类(没有额外的字段)

愚蠢的简单方法是这样做:

    private readonly IIntKeyedRepository<Object1> _object1Repository;
    private readonly IIntKeyedRepository<Object2> _object2Repository;
    private readonly IIntKeyedRepository<Object3> _object3Repository;
    private readonly IIntKeyedRepository<Object4> _object4Repository;
    private readonly IIntKeyedRepository<Object5> _object5Repository;

    public StaticDataController(IIntKeyedRepository<Object1> obj1Repository, IIntKeyedRepository<Object2> obj2Repository, IIntKeyedRepository<Object3> obj3Repository, IIntKeyedRepository<Object4> obj4Repository, IIntKeyedRepository<Object5> obj5Repository)
    {
        _obj1Repository= obj1Repository;
        _obj2Repository= obj2Repository;
        _obj3Repository= obj3Repository;
        _obj4Repository= obj4Repository;
        _obj5Repository= obj5Repository;
    }
Run Code Online (Sandbox Code Playgroud)

因为我将表作为参数传递给我的方法,所以我必须在我的控制器中使用一些switch语句来根据参数的字符串获取正确的存储库类.

我认为必须有一个更优雅的方式来支持我想要做的事情,所以我想看看这里是否有任何最佳实践(控制器继承,反射等)?

Dar*_*rov 9

如果您需要这样做,则意味着您的控制器执行了太多操作并强烈表明它需要服务层.在这种情况下,我将这些存储库驱逐到服务层.所以我的控制器需要一个服务而不是多个存储库:

private readonly IStatisticDataService _service;

public StaticDataController(IStatisticDataService service)
{
    _service = service;
}
Run Code Online (Sandbox Code Playgroud)

该服务具有可由多个原子库CRUD方法组成的业务.

我知道您可能会说:是的,但现在我必须将所有这些存储库注入IStatisticDataService接口的实现中.是的,但将这些原子CRUD操作聚合到服务层而不是控制器更有意义.

但是,如果需要5个或更多存储库来执行某些业务操作,可能您必须重新考虑您的域架构.可能您可以在域模型中使用组合并定义它们之间的关系,以减少存储库的数量.在不知道域名细节的情况下,很难提供更具体的建议.

现在,我有许多表和类都只有2个字段:

太棒了,让它们从相同的基本域模型派生出来,并有一个存储库来为它们提供服务.你可以使用descriminator列等...