2011-12-28 17 views
0

Active Directoryに機能を持つ3つのメソッドを持つクラスがあります。ライブラリクラスの破棄されたオブジェクト例外にアクセスできない

[Export(typeof(IAuthentication))] 
public class Authentication : IAuthentication 
{ 
    public bool Authenticate(string domain, string username, string password) 
    { 
     try 
     { 
      using (PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, domain, string.Empty)) 
      { 
       return principalContext.ValidateCredentials(
        username, 
        password, 
        ContextOptions.SimpleBind); 
      } 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

    public UserPrincipal GetUserDetails(string domain, string username) 
    { 
     try 
     { 
      using (PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, domain)) 
      { 
       return UserPrincipal.FindByIdentity(principalContext, username); 
      } 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

    public PrincipalSearchResult<Principal> SearchUsers(string domain, string firstName, string lastName, string userName) 
    { 
     try 
     { 
      using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domain)) 
      { 
       UserPrincipal user = new UserPrincipal(ctx); 
       user.Enabled = true; 
       user.Name = firstName + "* " + lastName + "*"; 
       user.SamAccountName = userName + "*"; 

       PrincipalSearcher principalSearcher = new PrincipalSearcher(); 
       principalSearcher.QueryFilter = user; 

       return principalSearcher.FindAll(); 
      } 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 
} 

あなたはクラス属性で見たように、私はMEFのプラグインとして、このクラスライブラリを使用しています:ここではクラスです。

PrincipalSearchResult<Principal> results = _authentication.SearchUsers(
                 ConfigurationManager.AppSettings["DomainName"], 
                 model.UserSearchCriteria.FirstName, 
                 model.UserSearchCriteria.LastName, 
                 model.UserSearchCriteria.Username); 

しかし、私はメソッドの戻り値を使用する予定の後、私は を取得していますことは、オブジェクト名を破棄されたオブジェクトにアクセスできません:私のasp.net MVC 3アプリケーションでは、私はこのようなメソッドを呼び出します。 'PrincipalContext'の例外です。私はPrincipalContextオブジェクトを破棄していますが、もしそうでなければ、Active Directoryへの接続は開いたままになります。私のクラスのデザインは正しくないと思う。どのように私はそれをクールな方法で動作させることができますか?

答えて

1

PrincipalSearchResult<T>のインスタンスで最終的に列挙したとき、この遅延操作がコンテキストにアクセスしようとしていることが想像されます。このシナリオでは、結果をすぐに列挙し、ドメイン固有のモデルとして返すほうがよいでしょう。私は、当時の仕事をして、返すことによってそれを延期しないでくださいPrincipalSearchResult<T>

+0

私はあなたのアドバイスをしますが、回答を承認する前に転送クラスを作成せずに誰かがこれを達成する方法を知っているかどうかを確認するために、数時間待つでしょう。どうもありがとう! :) – anilca