管理基础控制器中的ISession ...

时间:2011-07-29 10:57:19

标签: c# linq-to-sql asp.net-mvc-2 ninject

我避免在我的ISession中注入每个控制器,从而避免这种情况:Ninject with a base controller?

我正在尝试访问我的基本控制器中的IRepository,以便我可以在整个应用程序中使用它,使用下面的第二种方法管理对象的生命周期是否有任何问题?基本上我只想在每次操作请求时再次创建它...

//使用Ninject注入......

 private readonly IReadOnlySession _repo;
    public SimpleController(IReadOnlySession repo)
    {
        _repo = repo;
    }

//从基本控制器获取 - >我喜欢的方法......

public abstract class AbstractBaseController : Controller
{
  public AbstractBaseController() { }

 private static IReadOnlyGenericRepository readonlysession;
 public static IReadOnlyGenericRepository ReadOnlySession
 {
   get { return (readonlysession ?? (readonlysession = new ReadOnlyGenericRepository())); }
 }
}

//然后使用

进行访问
var detail = ReadOnlySession.Single<Cat>(x=> x.CatID== _catid);

IReadOnlyGenericRepository只是继承自:

public interface IReadOnlySession
    {
        T Single<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression) where T : class, new();
        System.Linq.IQueryable<T> All<T>() where T : class, new();
    }

更新:在我的AbstractBaseController中声明下面的代码,可以实现单元测试吗?

private IReadOnlySession readonlysession;
public IReadOnlySession _repo
{
   get { return (readonlysession ?? (readonlysession = GetReadOnlySession())); }
}

protected virtual IReadOnlySession GetReadOnlySession()
{
  return new ReadOnlyGenericRepository();
}

2 个答案:

答案 0 :(得分:2)

您还会向ReadOnlyGenericRepository引入固定的依赖关系。而且我认为单元测试和实现都不太可理解/可读。就个人而言,我认为这个解决方案会给你带来更多和更糟的负面因素,而不必添加一个构造函数参数(无论如何都是通过简单的Alt-Enter在Resharper中完成)。

正:

  • 不需要构造函数参数(或者说不同:在Resharper中保存单个Alt-Enter警示)

阴性:

  • 修复对ReadOnlyGenericRepository
  • 的依赖关系
  • 需要为每个控制器覆盖GetReadOnlySession()的测试类
  • 不易理解的单元测试和实施

如果有更多必须传递给基础构造函数,还要考虑聚合而不是继承。

答案 1 :(得分:1)

  

使用下面的第二种方法管理对象的生命周期是否有任何问题?

在基本控制器中使用此静态对象单独测试控制器可能有点困难。此外,我不知道这个IReadOnlySession应该代表什么,但因为它是静态的,它将在所有用户之间共享=&gt;所有请求,所以你应该确保它是线程安全的,...我个人更喜欢通过DI框架注入控制器的存储库方法。