我避免在我的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();
}
答案 0 :(得分:2)
您还会向ReadOnlyGenericRepository
引入固定的依赖关系。而且我认为单元测试和实现都不太可理解/可读。就个人而言,我认为这个解决方案会给你带来更多和更糟的负面因素,而不必添加一个构造函数参数(无论如何都是通过简单的Alt-Enter在Resharper中完成)。
正:
阴性:
ReadOnlyGenericRepository
GetReadOnlySession()
的测试类如果有更多必须传递给基础构造函数,还要考虑聚合而不是继承。
答案 1 :(得分:1)
使用下面的第二种方法管理对象的生命周期是否有任何问题?
在基本控制器中使用此静态对象单独测试控制器可能有点困难。此外,我不知道这个IReadOnlySession
应该代表什么,但因为它是静态的,它将在所有用户之间共享=&gt;所有请求,所以你应该确保它是线程安全的,...我个人更喜欢通过DI框架注入控制器的存储库方法。