I have a web application that uses linq-to-sql queries (will soon be upgraded to linq-to-EF compiled queries) and for which there’s data context and a database already in place. I want to create a demo version of the application and for the demo, I want to use an entirely different database file but that will have the same tables. So in essence, I’ll have the same data structure for two different databases: one database for logged-in users and one database for demo users. I want to reuse many of the queries I’ve already written; they look like this:
public class FruitQueries
{
public List<SomeObjectModel> MyQuery(list of parameters)
{
using (MyDataContext TheDC = new MyDataContext())
{
var TheQueryResult = (from f in TheDC.Fruits
......).ToList();
return TheQueryResult;
}
}
public List<SomeObject> AnotherQuery(some other parameters) {...}
}
Now I think I know that this calls for dependency injection where the data context is passed in as a parameter but I’m not sure on the syntax. How do you reuse queries using dependency injection to make them work on two different databases? Right now I’m using a using statement and I want to keep this pattern; is that possible if I inject the DC as a parameter?
Thanks.
Since you already have a lot of code in place, probably the simplest thing to do is to inject a factory:
All the code will roughly stay the same:
You can let the injected
IMyDataContextFactorydecide how to construct aMyDataContextinstance (based on the user). This would be trivial.In the end it will probably be better to inject a
MyDataContext(or an abstraction such asIUnitOfWork) into consumers, but this changes everything completely. Since this class is passed in from the outside, the consumer isn’t responsible anymore for disposing it, but someone else is. Although disposing such instance isn’t that hard with most DI container. It gets harder though when you want to share the sameMyDataContextinstance over multiple consumers (within the same web request for instance) and where do you callSubmitChanges?