- Entity Framework ObjectContext with Dependency Injection
- public MyDBEntities ctx
- {
- get
- {
- string ocKey = "ctx_" + HttpContext.Current.GetHashCode().ToString("x");
- if (!HttpContext.Current.Items.Contains(ocKey))
- HttpContext.Current.Items.Add(ocKey, new MyDBEntities ());
- return HttpContext.Current.Items[ocKey] as MyDBEntities ;
- }
- }
- public class IoCProvider
- {
- private static IoCProvider _instance = new IoCProvider();
- private IWindsorContainer _container;
- public IWindsorContainer
- {
- get
- {
- return _container;
- }
- }
- public static IoCProvider GetInstance()
- {
- return _instance;
- }
- private IoCProvider()
- {
- _container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle")));
- }
- }
- <configuration>
- <configSections>
- <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor" />
- </configSections>
- <castle>
- <components>
- <component id="DalLayer"
- service="MyDal.IDalLayer, MyDal"
- type="MyDal.MyDalLayer, MyDal"
- lifestyle="PerWebRequest">
- <!--
- Here we define that lifestyle of DalLayer is PerWebRequest so each
- time the container resolves IDalLayer interface in the same Web request
- processing, it returns same instance of DalLayer class
- -->
- <parameters>
- <connectionString>...</connectionString>
- </parameters>
- </component>
- <component id="BusinessLayer"
- service="MyBll.IBusinessLayer, MyBll"
- type="MyBll.BusinessLayer, MyBll" />
- <!--
- Just example where BusinessLayer receives IDalLayer as
- constructor's parameter.
- -->
- </components>
- </castle>
- <system.Web>
- ...
- </system.Web>
- </configuration>
- public IDalLayer
- {
- IRepository<T> GetRepository<T>(); // Simplified solution with generic repository
- Commint(); // Unit of work
- }
- // DalLayer holds Object context. Bacause of PerWebRequest lifestyle you can
- // resolve this class several time during request processing and you will still
- // get same instance = single ObjectContext.
- public class DalLayer : IDalLayer, IDisposable
- {
- private ObjectContext _context; // use context when creating repositories
- public DalLayer(string connectionString) { ... }
- ...
- }
- public interface IBusinessLayer
- {
- // Each service implementation will receive necessary
- // repositories from constructor.
- // BusinessLayer will pass them when creating service
- // instance
- // Some business service exposing methods for UI layer
- ISomeService SomeService { get; }
- }
- public class BusinessLayer : IBusinessLayer
- {
- private IDalLayer _dalLayer;
- public BusinessLayer(IDalLayer dalLayer) { ... }
- ...
- }
- public abstract class MyBaseForm : Page
- {
- private IBusinessLayer _businessLayer = null;
- protected IBusinessLayer BusinessLayer
- {
- get
- {
- if (_businessLayer == null)
- {
- _businessLayer = IoCProvider.GetInstance().Container.Resolve<IBusinessLayer>();
- }
- return _businessLayer;
- }
- ...
- }