• ef 多个模块,通过程序集映射entity,指定对应的repository


    在Entity Framework repository下加两个方法:

            public virtual T GetByEntityName(object id, string EntityTypeName)
            {
                dynamic repository = GetEFRepository(EntityTypeName);
                if (repository != null)
                    return repository.Entities.Find(id);
                else
                    return null;
            }
            
            public virtual dynamic GetRecordRepository(string EntityTypeName)
            {
                dynamic repository = GetEFRepository(EntityTypeName);
                if (repository != null)
                {
                    var type = repository.GetType().GetGenericArguments()[0];
                    dynamic part = Activator.CreateInstance(type);
                    return part;
                }
                else
                {
                    return null;
                }
            }
      private object GetEFRepository(string EntityTypeName)
            {

              

                if (_repositoryDictionary == null)
                {
                    var typesToRegister = TypeUtil.GetEntityTypes();
                    _repositoryDictionary = new Dictionary<string, object>();
                    foreach (var type in typesToRegister)
                    {
                        object repository = Activator.CreateInstance(typeof(EfRepository<>).MakeGenericType(type), _context);

                        _repositoryDictionary[type.Name] = repository;
                    }
                }

                if (_repositoryDictionary.ContainsKey(EntityTypeName))
                    return _repositoryDictionary[EntityTypeName];
                else
                    return null;
            }

     TypeUtil.cs

     public class TypeUtil
        {
            public static IList<Type> GetEntityTypes()
            {
                var cacheManager = new MemoryCacheManager();
                return cacheManager.Get("ENTITY-TYPE-ASSEMBLY", () =>
                {
                    var typesToRegister = Assembly.GetExecutingAssembly().GetTypes()
                     .Where(type => (typeof(BaseEntity).IsAssignableFrom(type) && (type.GetConstructor(Type.EmptyTypes) != null)));
                    return typesToRegister.ToList();
                });
                
            }
        }

    test:

     [Test]
            public void TypeUtilTest()
            {
    
                var n = _repository.GetRecordRepository("NewsEntity");
                dynamic nm = _repository.GetByEntityName(1, "NewsEntity");
                var title = nm.Title;
    
                var c = _repository.GetRecordRepository("NewsCommentEntity");
                dynamic cm = _repository.GetByEntityName(1, "NewsCommentEntity");
                var comment = cm.Comment;
                string pass = title + "
    " + comment;
                Assert.Pass(pass);
               
            }
  • 相关阅读:
    4. 单向循环链表
    3. 单向链表
    2. 队列的实现
    1. 时间复杂度(大O表示法)以及使用python实现栈
    Ubuntu16.04LTS安装集成开发工具IDE: CodeBlocks 和Eclipse-cdt
    Ubuntu16.04搭建各种开发环境的IDE: QT5 , CodeBlocks ,eclipse-cdt, PyCharm
    python2和python3 分别连接MySQL的代码
    面向对象基础
    文件的处理
    离散表(哈希表),深浅拷贝
  • 原文地址:https://www.cnblogs.com/wlwjc/p/3963043.html
Copyright © 2020-2023  润新知