2014-04-07 79 views
0

嗨我正在开发一个通用解决方案,我在此扩展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和​​与CustomIdentity1CustomIdentity2我必须知道在初始化逻辑可以在一个通用的方法事业工作,未来我们可以有更多类型的IIdentityIIdentityInitializer

回答

0

所以这种解决方案似乎不太正确。具体来说,你试图说DBIdentityInitializer是的,数据库连接的东西可能是通用的,但它也非常依赖于类型T.这不能很容易地通用。所以看起来像将数据库访问这么多的工作放到组件中可能会更好一些,该组件可以从数据存储中获取任意实体 - 就像一个ORM。然后,每个DBIdentityInitializer现在都有一个像DBCustomerIdentity1Initializer这样的具体类型,但实际的努力工作来自ORM部分 - 初始化程序仅仅是一个微小的数据转换类,它代表了将一种数据类型映射到另一种数据类型的一小块独特逻辑。所以你仍然会发生类型爆炸,但更易于管理。如果您绝对必须通过一个DBIdentityIntializer推送所有内容,我建议让主类有一个Dictionary>或一些这样的实际获得的身份初始化程序:例如,一个条目实际上可能是[CustomerIdentity1,DBCustomerIdentity1Initializer]。或者,您可能可以使用lambda表示初始化程序而不是完整的对象。无论如何,它仍然是相同的解决方案,只需将复合部件全部放在一个包装中,以便一个物体可以传递。然后将T用作查找,如果存在初始化程序,则它将初始化。任何时候你使用一个带有类型的字典,你可能想要评估代码的味道。