zoukankan      html  css  js  c++  java
  • 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);
               
            }
  • 相关阅读:
    js技巧大全
    DOM
    网页页面跳转几种方法
    JavaScript中创建对象的几种方式
    web本地存储-UserData
    图片预加载
    闭包
    JavaScript高级编程学习笔记(第三章之一)
    .net core 部署到ubuntu
    fiddler autoresponder 动态修改响应内容
  • 原文地址:https://www.cnblogs.com/wlwjc/p/3963043.html
Copyright © 2011-2022 走看看