如何使用Unity注册和解析有条件的泛型类型



我的主要模型类是"RoleMaster"one_answers"UserMaster"

public  class RoleMaster
{
    public int RoleId { get; set; }
    public string RoleName { get; set; }
}
public  class UserMaster
{
    public int UserId { get; set; }
    public string UserName { get; set; }
}

这是我的主存储库接口

   public interface IRepository<in T> where T : class 
   {
       bool Add(T entity);
   }

RoleMaster 的已实现类

public class RoleRepository : IRepository<RoleMaster>
    {
        public bool Add(RoleMaster entity)
        {
             //Add Logic
        }
}

UserMaster 的已实现类

  public class UserRepository : IRepository<UserMaster>
        {
            public bool Add(UserMaster entity)
            {
              //Add Logic
            }
    }

现在我想实现

 container.RegisterType<(IRepository<T>)(new InjectionFactory(m =>
            {
                if (typeof(T) is RoleMaster)
                {
                    m.Resolve<RoleRepository>();
                }
                else if (typeof(T) is UserMaster)
                {
                    m.Resolve<UserRepository>();
                }
                return m;
            }));

使用Unity有可能吗?

做这种有条件的Resolve的最佳方法是什么?

您只需要用unity 显式注册它们

container.RegisterType<IRepository<RoleMaster>, RoleRepository>();
container.RegisterType<IRepository<UserMaster>, UserRepository>();

我建议您使用通用存储库模式,或者为每个存储库创建一个新的接口。或者两者的结合,但这可能会让人感到困惑。

对于泛型存储库(有很多例子),您只需要对容器进行一次调用来注册打开的泛型类型,因为IRepsitory<T>接口只有一个实现。。。

container.RegisterType(typeof(IRepository<>), typeof(GenericRepository<>));

但是,如果您计划在每个存储库中添加自定义方法,则可能需要在该实体类型的自定义存储库接口上定义这些方法。然后最好在自定义存储库接口上进行注册,而不是在通用接口上。。。

container.RegisterType<IRepositoryRole, RoleRepository>();
public interface IRepositoryRole : IRepository<RoleMaster> 
{
    public void DoCustomRoleWork(...) { ... }
}

最新更新