开发者

MVC 3 + IoC + NInject + Repositories + LINQ

I'm trying to work with NInject in my MVC 3 application, and i have one question.

Interface

public interface ITalesRepository
{
    IEnumerable<Tale> GetAllTales();
}

Repository

public class TalesRepository : ITalesRepository
{
    private FairyTalesMVC3DataContext _dataContext;

    public TalesRepository(FairyTalesMVC3DataContext dataContext)
    {
        _dataContext = dataContext;
    }

    public IEnumerable<Tale> GetAllTales()
    {
        return _dataContext.Tales.OrderBy(c => c.NameAn);
    }
}

Home controller

public class HomeController : Controller
{
    private readonly ITalesRepository _talesRepository;

    public HomeController(ITalesRepository talesRepository)
    {
        _talesRepository = talesRepository;
    }

    public ActionResult Index()
    {
        ViewBag.Tales = _talesRepository.GetAllTales();

        return View();
    }
}

So, i need to initialize my TalesRepository with DataContext, and now it is so:

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开发者_运维技巧));
}

So, my question, is it ok or something wrong?


First of all:

public IEnumerable<Tale> GetAllTales()
{
    return _dataContext.Tales.OrderBy(c => c.NameAn);
}

I would add .ToList() to the end. Else you'll get data layer exceptions in your presentation layer which is not fine.

Next, I would recommend that you switch to ViewModels instead of using ViewBag. It's a lot easier to prevent that logic leaks into the views if you are using ViewModels. Since you can add the logic to the ViewModel and thus get the same behaviour in all views using the model.


Your application should inherit from NinjectHttpApplication. It registers dependency resolver, so you don't have to do it.

You should also override CreateKernel in application class and register your own module with bindings:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜