25

I am trying to use Ninject and OpenAccess for the first time. Please help me with the following. Here is what my project looks like...

public class ContentController : Controller
{
    private ContentService contentSvc;

    public ContentController(ContentService contentSvc)
    {
        this.contentSvc = contentSvc;
    }
}

The following class is under a folder in my web app.

public class ContentService
{
    private IContentRepository contentRepository;

    public ContentService(IContentRepository contentRepository)
    {
        this.contentRepository = contentRepository;
    }

    public void InsertContent(Content content)
    {
         contentRepository.InsertContent(content);
    }
}

The following repository belongs to a separate assembly.

public class ContentRepository : IContentRepository
{
    DBContext db;
    public ContentRepository(DBContext _db)
    {
        db = _db;
    }

    public void InsertContent(Content content)
    {
             db.Add(content);
    }
}   

Here is what Ninject binding look like..

kernel.Bind<ContentService>().To<ContentService>().InRequestScope();
kernel.Bind<IContentRepository>().To<ContentRepository>().InRequestScope().WithConstructorArgument("_db", new DBContext());

Everything works fine if I fetch one page at a time. I am using a simple tool 'XENU' to fetch multiple pages simultaneously. This is when I get errors with DBContext by fetching multiple pages at a time.

I am not sure if Ninject is dosposing the DBContext in each REQUEST?? I get different errors, e.g. 'Object reference not set to an instance of an object.', OR 'ExecuteReader requires an open and available Connection. The connection's current state is open.'

P.S.

I have ContentService under a folder in my MVC web app. ContentRepository is a separate assembly. I will be adding business logic in ContentService and use 'ContentRepository' only for CRUD operations. Also, please let me know if this architecture is okay or is there a better way to create services and repositories.

3
  • 2
    I'm a big fan of seperating logical operations (your services) from data operations (your repository). Its worked really well for me in the past. I think this is a great model Commented Aug 12, 2012 at 11:50
  • Thanks, this has saved me weeks of headache trying to figure out why my dbcontext was crashing constantly. I also used the WithConstructorArgument (inject<dbcontext>)... This should be documented more clearly somewhere! Commented Feb 4, 2015 at 9:52
  • I used kernel.Bind<DbContext>().To<DBEntities>() while working with EF. Commented Mar 26, 2015 at 9:26

1 Answer 1

31

Here's how I would do your Ninject bindings,

kernel.Bind<DBContext>().ToSelf().InRequestScope();
kernel.Bind<ContentService>().ToSelf().InRequestScope();
kernel.Bind<IContentRepository>().To<ContentRepository>().InRequestScope();

This pattern should work fine in the example above with EF and Ninject.

Sign up to request clarification or add additional context in comments.

7 Comments

@Luke If you inject 2 repositories in the ContentService you get 2 different context where you can not commit a transaction when both repositories go to 2 different tables. Is that assumption right?
@Elisa yah thats the intention
@Luke But if you have 2 different context in each repository you can not do a transaction spanning both repositories. I think this is a problem. I would recommend to the question opener to inject an IUnitOfWork into his service so a service can make a call on 2 repositories and commit that. This would be a better approach, do yu agree?
@elisa the idea is that you share the DBContext between both repositories, if you have completely separate DBContexts and want to have both commit in the same transaction you will need to use transaction scope and the DTC which is pretty heavy handed. Given we are talking about a web application the request really is the unit of work so IMO you are better to just share the context between all repositories involved in the request. hence binding the context .InRequestScope() in the above
What about in a unit test? What would your bindings look like? No asp.net or mvc, but similar repo setup
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.