Exemplo n.º 1
0
        /// <summary>
        /// 注册元数据定义
        /// </summary>
        /// <param name="assembly"></param>
        public void RegisterDefineMetadata(Assembly assembly)
        {
            if (assembly == null)
            {
                throw new ArgumentNullException("assembly");
            }

            Type[] types = assembly.GetExportedTypes();
            foreach (Type type in types)
            {
                var v = type.GetInterface(typeof(ICacheMetadataProvider).FullName);
                if (v != null)
                {
                    var active   = FastActivator.Create(type);
                    var metadata = ((ICacheMetadataProvider)active).GetCacheMetadata();

                    if (metadatas.ContainsKey(metadata.EntityType))
                    {
                        throw new PlatformException("重复的类型定义。\r\nEntityType:{0}, DefineType:{1}", metadata.EntityType.FullName, type.FullName);
                    }

                    //验证方法virtual
                    EntityUtil.CheckVirtualType(metadata.EntityType);

                    metadatas.Add(metadata.EntityType, metadata);
                }
            }
        }
        public void Load()
        {
            var repositoryType = typeof(IRepository <>).FullName;
            var baseType       = typeof(IRepository);

            foreach (var assembly in assemblies)
            {
                var types = assembly.GetTypes().Where(o => o.IsClass && !o.IsAbstract && !o.IsGenericTypeDefinition && o.GetInterface(repositoryType) != null);
                foreach (var type in types)
                {
                    //验证方法virtual
                    EntityUtil.CheckVirtualType(type);

                    var entityType = ReflectionHelper.GetEntityTypeFromRepositoryType(type);
                    var metadata   = RepositoryFramework.GetDefineMetadataAndCheck(entityType);

                    //使用继承的方式创建代理
                    var proxy      = ProxyProvider.Generator.CreateClassProxy(type, new RepositoryInterceptor());
                    var interfaces = type.GetInterfaces().Where(o => o != baseType);
                    foreach (var i in interfaces)
                    {
                        this.register.Register(i, proxy);
                        //ServiceLocator.Current.Register(i, proxy);
                        //Container.Register(i, proxy);
                    }
                }
            }
        }