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个字段:
对于这些类中的每一个,我只是从一个名为的基类继承:
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语句来根据参数的字符串获取正确的存储库类.
我认为必须有一个更优雅的方式来支持我想要做的事情,所以我想看看这里是否有任何最佳实践(控制器继承,反射等)?
如果您需要这样做,则意味着您的控制器执行了太多操作并强烈表明它需要服务层.在这种情况下,我将这些存储库驱逐到服务层.所以我的控制器需要一个服务而不是多个存储库:
private readonly IStatisticDataService _service;
public StaticDataController(IStatisticDataService service)
{
_service = service;
}
Run Code Online (Sandbox Code Playgroud)
该服务具有可由多个原子库CRUD方法组成的业务.
我知道您可能会说:是的,但现在我必须将所有这些存储库注入IStatisticDataService接口的实现中.是的,但将这些原子CRUD操作聚合到服务层而不是控制器更有意义.
但是,如果需要5个或更多存储库来执行某些业务操作,可能您必须重新考虑您的域架构.可能您可以在域模型中使用组合并定义它们之间的关系,以减少存储库的数量.在不知道域名细节的情况下,很难提供更具体的建议.
现在,我有许多表和类都只有2个字段:
太棒了,让它们从相同的基本域模型派生出来,并有一个存储库来为它们提供服务.你可以使用descriminator列等...
| 归档时间: |
|
| 查看次数: |
819 次 |
| 最近记录: |