我正在尝试在我的MVC 3应用程序中使用NInject,我有一个问题。
接口
public interface ITalesRepository
{
IEnumerable<Tale> GetAllTales();
}
存储库
public class TalesRepository : ITalesRepository
{
private FairyTalesMVC3DataContext _dataContext;
public TalesRepository(FairyTalesMVC3DataContext dataContext)
{
_dataContext = dataContext;
}
public IEnumerable<Tale> GetAllTales()
{
return _dataContext.Tales.OrderBy(c => c.NameAn);
}
}
家庭控制器
public class HomeController : Controller
{
private readonly ITalesRepository _talesRepository;
public HomeController(ITalesRepository talesRepository)
{
_talesRepository = talesRepository;
}
public ActionResult Index()
{
ViewBag.Tales = _talesRepository.GetAllTales();
return View();
}
}
所以,我需要使用DataContext初始化我的TalesRepository,现在就是这样:
private void RegisterDependencyResolver()
{
var kernel = new StandardKernel();
kernel.Bind<ITalesRepository>().To<TalesRepository>().WithConstructorArgument("dataContext", new FairyTalesMVC3DataContext(ConfigurationManager.ConnectionStrings["dbFairyTalesConnectionString"].ConnectionString));
DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
}
所以,我的问题,是好还是错了?
答案 0 :(得分:1)
首先:
public IEnumerable<Tale> GetAllTales()
{
return _dataContext.Tales.OrderBy(c => c.NameAn);
}
我会在最后添加.ToList()
。否则,您将在表示层中获得数据层异常,这是不合适的。
接下来,我建议您切换到ViewModels而不是使用ViewBag。如果您使用的是ViewModel,那么防止逻辑泄漏到视图中要容易得多。因为您可以将逻辑添加到ViewModel,从而在使用该模型的所有视图中获得相同的行为。
答案 1 :(得分:0)
您的应用程序应继承自NinjectHttpApplication
。它注册依赖项解析器,因此您不必这样做。
您还应该覆盖应用程序类中的CreateKernel并使用绑定注册您自己的模块:
public class MvcApplication : NinjectHttpApplication
{
protected override IKernel CreateKernel()
{
return new StandardKernel(new INinjectModule[] {new MvcModule()});
}
}
public class MvcModule : NinjectModule
{
public override void Load()
{
Bind<ITalesRepository>().To<TalesRepository>();
Bind<FairyTalesMVC3DataContext>().To<FairyTalesMVC3DataContext>().InRequestScope();
}
}