C# 如何使用Unity注册和解析条件泛型类型

C# 如何使用Unity注册和解析条件泛型类型,c#,asp.net-mvc-4,unity-container,C#,Asp.net Mvc 4,Unity Container,我的主要模型类是RoleMaster和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; } } publ

我的主要模型类是RoleMaster和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 class UserRepository : IRepository<UserMaster>
        {
            public bool Add(UserMaster entity)
            {
              //Add Logic
            }
    }
这是我的主存储库界面

   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 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 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注册它们

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

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

对于泛型存储库,有很多示例,您只需对容器进行一次调用即可注册开放泛型类型,因为只有一个iRepository接口的实现

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

public interface IRepositoryRole : IRepository<RoleMaster> 
{
    public void DoCustomRoleWork(...) { ... }
}
但是,如果您计划在每个存储库上添加自定义方法,则可能需要在该实体类型的自定义存储库接口上定义这些方法。然后最好在自定义存储库接口上注册,而不是在通用接口上注册

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

public interface IRepositoryRole : IRepository<RoleMaster> 
{
    public void DoCustomRoleWork(...) { ... }
}

当您发现自己在检查泛型类/方法中的类型时,您的设计在某个地方失败了。那么,执行此类操作的最佳方法是什么?