您好我正在开发一个通用解决方案,我正在扩展System.Security.Principal.IIdentity
以添加更多用户信息。此组件将再次用于不同的解决方案用户信息将来自不同的来源,如DB或Active Directory甚至XML文件。我已经为IIdentityInitializer
初始化IIdentity
做了一些解决方案,我将有不同的类实现这些接口。
public interface IIdentityInitializer<T>
where T:IIdentity
{
T Initialize(string userid, string password)
}
public ActiveDirectoryIdentityInitializer<T> :IIdentityInitializer<T>
where T:IIdentity
{
public T Initialize(string username, string password)
{
//Load Logic and assign data from Active directory to different property of T
}
}
public DBIdentityInitializer<T>:IIdentityInitializer<T>
where T:IIdentity
{
public T Initialize(string username, string password)
{
//Load Logic and assign data from DB to different property of T
}
}
public CustomIdentity1:IIdentity
{
public string Name{get;set}
public string EMail{get;set;}
public CustomIdentity1(IIdentityInitializer<CustomIdentity1> ci){}
}
public CustomIdentity2:IIdentity
{
public string Name{get;set}
public string EMail{get;set;}
public string Mobile{get;set;}
public string EmployeeId{get;set;}
public CustomIdentity2(IIdentityInitializer<CustomIdentity2> ci){}
}
现在我有ActiveDirectoryInitializer
和DBInitializer
CustomIdentity1
和CustomIdentity2
我必须知道初始化中的逻辑可以通用的方式使用,因为将来我们可以有更多类型的IIdentity
和IIdentityInitializer
。
答案 0 :(得分:0)
所以这个解决方案似乎不太正确。具体来说,你试图说一个DBIdentityInitializer,是的,数据库连接的东西可能是通用的,但它也很大程度上取决于类型T.它不能很容易地变得通用。因此,似乎可以更好地将数据库中的大部分工作推送到从数据存储中获取任意实体的组件(如ORM)。然后每个DBIdentityInitializer现在都有一个类似于DBCustomerIdentity1Initializer的具体类型,但实际的工作是在ORM部分 - 初始化器只是一个小小的数据转换类,它代表了将一种数据类型映射到另一种数据类型的一小部分独特逻辑。所以你仍然会遇到类型爆炸,但更容易管理。如果你绝对必须通过一个DBIdentityIntializer推送所有内容,我建议让主类有一个Dictionary&gt;或者某些实际上获得了向其注册的身份初始化者:例如,一个条目实际上可能是[CustomerIdentity1,DBCustomerIdentity1Initializer]。或者,您可以将lambda用于初始化器而不是完整的对象。无论如何,它仍然是相同的解决方案,只需将复合部件全部放在一个包装器中,这样就可以传递一个对象。然后将T用作查找,如果存在初始值设定项,则进行初始化。任何时候你使用带有类型的字典,你可能想要评估代码气味。