我避免在我的Isession注入到每一个控制器,这样就避免了这一点:Ninject with a base controller?管理的ISession在基本控制器...
我试图访问我的基地控制器内我的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简单地来回继承m:
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();
}
它比这更复杂。无论如何,是的,存在一个固定的依赖关系 - 但正如你所说的,你可以覆盖,因为我有一个抽象的基础控制器 - 它可以很容易地在一个地方和其他地方重写。我们可以说它还不太容易理解吗?那不是开发人员偏好使用Composition而不是继承? – Haroon
当我需要多个接口时,问题就出现了,我总是注入,传递到我的基本控制器上,难道我们不能说在这些情况下会出现好处吗?我的意思是特别是如果行为可以被过度使用... – Haroon
我认为在这情况首先出现问题。如果你需要传递如此多的接口到基地继承可能不是最好的解决方案。正如你所说的那样考虑构图。同时检查是否履行单一责任原则。在大多数情况下,注射很复杂,实施有些问题。 –