MVC 3 + IoC + NInject +存储库+ LINQ

时间:2011-02-22 12:44:35

标签: asp.net-mvc

我正在尝试在我的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));
}

所以,我的问题,是好还是错了?

2 个答案:

答案 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();
    }
}