中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

我心中的(de)核心組件(可插拔的(de)AOP)~第十二回 IoC組件Unity

回到目錄

說在前

Ioc組件有很多,之前也介紹過autofac,castle等,今天再來說一下在微軟Nlayer DDD架構里使用的unity組件,今天主要說一下依靠注入,如果希望看攔截的用法,可以閱讀這篇文章第十三回 實現AOP的攔截組件Unity.Interception

做在后

unity的用法主要說一下(xia)接口(kou)(kou)注(zhu)入(ru)(ru)方法,它包括了程序中注(zhu)入(ru)(ru)和(he)配置文件注(zhu)入(ru)(ru),而接口(kou)(kou)注(zhu)入(ru)(ru)還分為普通接口(kou)(kou)注(zhu)入(ru)(ru)和(he)泛型接口(kou)(kou)注(zhu)入(ru)(ru),下(xia)面(mian)分別來說一下(xia):

普通接口和類實現代碼

  public interface IUser
    {
        IQueryable<WebManageUsers> GetEntities();
    }
   public class UserRepository : BackgroundRepository<WebManageUsers>, IUser
    {
        public IQueryable<WebManageUsers> GetEntities()
        {
            return this.GetModel();
        }
    }

 

普通接口注入,程序中的注入

   using (IUnityContainer container = new UnityContainer())
                {
                   container.RegisterType<IUser, DataTest.UserRepository>();
                    var repository = container.Resolve<IUser>();
                }

普通接口注入,配置文件中的注入

  <unity xmlns="//schemas.microsoft.com/practices/2010/unity">
    <container>
      <register  type="EntityTest.IUser,EntityTest" mapTo="DataTest.UserRepository, DataTest" />
       </container>
  </unity>
 using (IUnityContainer container = new UnityContainer())
                {
                    ConfigurationManager.GetSection("unity");
                    UnityConfigurationSection.CurrentSection.Configure(container);
                    var repository = container.Resolve<IUser>();
                }

普通接口和類實現代碼

 /// <summary>
    /// 基礎(chu)的數(shu)據操作規范
    /// </summary>
    /// <typeparam name="TEntity"></typeparam>
    public interface IRepository<TEntity>
           where TEntity : class
    {
        /// <summary>
        /// 添(tian)加實(shi)體并提交到數據服務器
        /// </summary>
        /// <param name="item">Item to add to repository</param>
        void Insert(TEntity item);

        /// <summary>
        /// 移(yi)除實體并提交到數據服務器
        /// 如果表(biao)存在(zai)約(yue)束(shu),需要先刪除子表(biao)信(xin)息(xi)
        /// </summary>
        /// <param name="item">Item to delete</param>
        void Delete(TEntity item);

        /// <summary>
        /// 修(xiu)改(gai)實體(ti)并提交到數(shu)據服(fu)務器
        /// </summary>
        /// <param name="item"></param>
        void Update(TEntity item);

        /// <summary>
        /// 得到(dao)指(zhi)定的實(shi)體集合(he)(延時(shi)結果集)
        /// Get all elements of type {T} in repository
        /// </summary>
        /// <returns>List of selected elements</returns>
        IQueryable<TEntity> GetModel();

        /// <summary>
        /// 根(gen)據主鍵得到(dao)實體(ti)
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        TEntity Find(params object[] id);
    }
    public class BackgroundRepository<T> : IRepository<T> where T : class
    {
#region IRepository<TEntity> 成員

        public virtual void Insert(TEntity item)
        {
            OnBeforeSaved(new SavedEventArgs(item, SaveAction.Insert));
            Db.Entry<TEntity>(item);
            Db.Set<TEntity>().Add(item);
            this.SaveChanges();
            OnAfterSaved(new SavedEventArgs(item, SaveAction.Insert));
        }

        public virtual void Delete(TEntity item)
        {
            OnBeforeSaved(new SavedEventArgs(item, SaveAction.Delete));
            Db.Set<TEntity>().Attach(item);
            Db.Set<TEntity>().Remove(item);
            this.SaveChanges();
            OnAfterSaved(new SavedEventArgs(item, SaveAction.Delete));
        }

        public virtual void Update(TEntity item)
        {
            OnBeforeSaved(new SavedEventArgs(item, SaveAction.Update));
            Db.Set<TEntity>().Attach(item);
            Db.Entry(item).State = EntityState.Modified;
            this.SaveChanges();
            OnAfterSaved(new SavedEventArgs(item, SaveAction.Update));
        }

        /// <summary>
        /// 子(zi)類(lei)在實(shi)現時,可以(yi)重寫,加(jia)一些狀態過濾(lv)
        /// </summary>
        /// <returns></returns>
        public virtual IQueryable<TEntity> GetModel()
        {
            //  return Db.Set<TEntity>().AsNoTracking();//對象無(wu)法自動添(tian)加到上下文中,因為它是使用 NoTracking 合并選項檢(jian)索(suo)的。請在定義此關(guan)系(xi)之前(qian),將(jiang)該實(shi)體顯式附(fu)加到 ObjectContext。
            return Db.Set<TEntity>();////ObjectStateManager 中已存在具(ju)有(you)(you)同一鍵的對(dui)象(xiang)。ObjectStateManager 無(wu)法跟蹤具(ju)有(you)(you)相同鍵的多個對(dui)象(xiang)。
        }
        /// <summary>
        /// 得到原生態結果集
        /// </summary>
        /// <returns></returns>
        public IQueryable<TEntity> GetEntities()
        {
            return Db.Set<TEntity>();
        }
        #endregion
 }

泛型接口注入,程序中的注入

  using (IUnityContainer container = new UnityContainer())
                {
                   container.RegisterType<IRepository<User>, BackgroundRepository<User>>();
                    var re = container.Resolve<IRepository<User>>();
                }

泛型接口注入,配置文件中的注入

  <unity xmlns="//schemas.microsoft.com/practices/2010/unity">
    <container>
         <register  type="IRepository.Core.IRepository`1,IRepository.Core" mapTo="DataTest.BackgroundRepository`1, DataTest" />
    </container>
  </unity>
  using (IUnityContainer container = new UnityContainer())
                {
                    ConfigurationManager.GetSection("unity");
                    UnityConfigurationSection.CurrentSection.Configure(container);
                 var re = container.Resolve<IRepository<User>>();
                }

下面我們(men)封(feng)裝一(yi)個服務定(ding)位器,讓它(ta)把Unity容器封(feng)裝一(yi)下,方便(bian)以后調(diao)用(yong)它(ta),下面是ServiceLocator的原代碼:

  /// <summary>
    /// Represents the Service Locator.
    /// </summary>
    public sealed class ServiceLocator : IServiceProvider
    {
        #region Private Fields
        private readonly IUnityContainer _container;
        #endregion

        #region Private Static Fields
        private static readonly ServiceLocator instance = new ServiceLocator();
        #endregion

        #region Ctor
        /// <summary>
        /// Initializes a new instance of ServiceLocator class.
        /// </summary>
        private ServiceLocator()
        {
            UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
            _container = new UnityContainer();
            section.Configure(_container);
        }
        #endregion

        #region Public Static Properties
        /// <summary>
        /// Gets the singleton instance of the ServiceLocator class.
        /// </summary>
        public static ServiceLocator Instance
        {
            get { return instance; }
        }
        #endregion

        #region Private Methods
        private IEnumerable<ParameterOverride> GetParameterOverrides(object overridedArguments)
        {
            List<ParameterOverride> overrides = new List<ParameterOverride>();
            Type argumentsType = overridedArguments.GetType();
            argumentsType.GetProperties(BindingFlags.Public | BindingFlags.Instance)
                .ToList()
                .ForEach(property =>
                {
                    var propertyValue = property.GetValue(overridedArguments, null);
                    var propertyName = property.Name;
                    overrides.Add(new ParameterOverride(propertyName, propertyValue));
                });
            return overrides;
        }
        #endregion

        #region Public Methods
        /// <summary>
        /// Gets the service instance with the given type.
        /// </summary>
        /// <typeparam name="T">The type of the service.</typeparam>
        /// <returns>The service instance.</returns>
        public T GetService<T>()
        {
            return _container.Resolve<T>();
        }
        /// <summary>
        /// Gets the service instance with the given type by using the overrided arguments.
        /// </summary>
        /// <typeparam name="T">The type of the service.</typeparam>
        /// <param name="overridedArguments">The overrided arguments.</param>
        /// <returns>The service instance.</returns>
        public T GetService<T>(object overridedArguments)
        {
            var overrides = GetParameterOverrides(overridedArguments);
            return _container.Resolve<T>(overrides.ToArray());
        }
        /// <summary>
        /// Gets the service instance with the given type by using the overrided arguments.
        /// </summary>
        /// <param name="serviceType">The type of the service.</param>
        /// <param name="overridedArguments">The overrided arguments.</param>
        /// <returns>The service instance.</returns>
        public object GetService(Type serviceType, object overridedArguments)
        {
            var overrides = GetParameterOverrides(overridedArguments);
            return _container.Resolve(serviceType, overrides.ToArray());
        }
        #endregion

        #region IServiceProvider Members
        /// <summary>
        /// Gets the service instance with the given type.
        /// </summary>
        /// <param name="serviceType">The type of the service.</param>
        /// <returns>The service instance.</returns>
        public object GetService(Type serviceType)
        {
            return _container.Resolve(serviceType);
        }

        #endregion
    }

下(xia)面再去(qu)使用unity時就方便多了,呵呵,看代(dai)碼:

 var model = ServiceLocator.Instance.GetService<IExtensionRepository<WebManageUsers>>().GetModel().ToList();

而使用ServiceLocator還有一個好處,就是不需要使用"實現的程序集",只要把"實現的程序集"和它的相(xiang)關依賴的程序集一起復制到WEB項目的BIN目錄即可,服務定位器會自己去定位的.

好了,講到這里(li)也就差不多了,需要注意(yi)的(de)是,如果你(ni)在項目中進(jin)行注入(ru)時,需要先注入(ru)的(de)實現(xian)類所在的(de)程序集也引入(ru)進(jin)來,否則也是不可(ke)以resolve出來對象(xiang)的(de),而對于業務層(領(ling)域)層來說,不需要關心(xin)底層

的實現(xian)技(ji)術(shu),即(ji)(ji)不(bu)需要引(yin)用實現(xian)類(lei)的程序(xu)集(ji),而(er)在(zai)業務層引(yin)用接口程序(xu)集(ji)即(ji)(ji)可.

 回到目錄

posted @ 2013-12-12 10:46  張占嶺  閱讀(2992)  評論(2)    收藏  舉報