Entity Framework ObjectContext with Dependency Injection

后端 未结 1 1199
一向
一向 2021-01-17 06:29

Well, it seems like I\'m stuck in my application structure. Here\'s what I want to do:

  • UI layer: An ASP.NET webforms website.
  • BLL: Business logic la
相关标签:
1条回答
  • 2021-01-17 07:05

    I have never used IoC container with WebForms so get this as some high level solution which should probably be futher improved.

    You can try creating some IoC provider as singleton:

    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")));
      }
    }
    

    Your web.config will have to contain sections like (the configuration is based on your previous post):

    <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>
    

    Implementation of these interfaces and classes can look like:

    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) { ... }
    
      ...
    }
    

    Than you can define base class for your pages and expose the business layer (you can do the same with any other class which can be resolved):

    public abstract class MyBaseForm : Page
    {
      private IBusinessLayer _businessLayer = null;
      protected IBusinessLayer BusinessLayer
      {
        get 
        { 
          if (_businessLayer == null)
          {
            _businessLayer = IoCProvider.GetInstance().Container.Resolve<IBusinessLayer>(); 
          }
    
          return _businessLayer;         
      }
    
      ...
    }
    

    Complex solution whould involve using custom PageHandlerFactory to resolve pages directly and inject dependencies. If you want to use such solution check Spring.NET framework (another API with IoC container).

    0 讨论(0)
提交回复
热议问题