C# 如何使用Unity注册和解析条件泛型类型
我的主要模型类是RoleMaster和UserMasterC# 如何使用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
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(...) { ... }
}
当您发现自己在检查泛型类/方法中的类型时,您的设计在某个地方失败了。那么,执行此类操作的最佳方法是什么?