2017-06-07 11 views
0

私は所有インスタンスについて再調査しており、設定する必要があります。 http://docs.autofac.org/en/latest/advanced/owned-instances.htmlautofacと所有インスタンス

この所有インスタンスを使用する同じクラスに2つのメソッドがあります。私はこのようにそれを設定している:

private readonly Func<SessionDetails, Owned<ITroposUnitOfWork>> _paramatizedTroposUnitOfWork; 

作業クラスのコンストラクタの私のユニットは、次のようになります。だから、

/// <summary> 
/// Used for creating manual sessions 
/// </summary> 
/// <param name="sessionDetails">The details of the session to be created</param> 
public TroposUnitOfWork(SessionDetails sessionDetails) 
{ 

    // Throw if we don't supply any details 
    ThrowIf.ArgumentIsNull(() => sessionDetails); 

    // Start the session 
    StartSession(sessionDetails); 
} 

、私の理解は、ユニット、その後、私はブロックを使用してを使用した場合ということです仕事の終わりに処分されます。しかし、そうではありません。 前にも触れましたが、この所有インスタンスを使用する2つのメソッドがあります。

/// <summary> 
/// Creates the Tropos user 
/// </summary> 
/// <param name="model">The user to be created</param> 
/// <param name="password">The password to set</param> 
private async Task CreateTroposUserAsync(User model, string password) 
{ 

    // If there is no password, throw an error 
    ThrowIf.ArgumentIsNull(() => password); 

    // Get our master user 
    var user = await base.FindByNameAsync(model.Master); 

    // If we have no master user, throw an error 
    if (user == null) throw new ObjectNotFoundException(); 

    // Create our session details 
    var sessionDetails = _troposSession.Value.Create(user); 

    // User our new user 
    using (var troposUnitOfWork = _paramatizedTroposUnitOfWork(sessionDetails)) 
    { 

     try 
     { 

      // Create our tropos user service 
      var userService = new TroposUserService(troposUnitOfWork.Value); 

      // Create our user 
      var transaction = userService.Create(model); 

      // Save our changes (Don't throw an error if the user already exists) 
      troposUnitOfWork.Value.RunTransaction(transaction); 

     } catch (Exception ex) 
     { 

      // Display human readable messages 
      throw new Exception(ex.Message); 
     } 
    } 

    // Sets the new users password 
    SetTroposPassword(model, password); 

    // Update the flag 
    model.HasTroposLogin = true; 
} 

他方はである:それらは

/// <summary> 
/// Sets the tropos password 
/// </summary> 
/// <param name="model">The user that needs the password setting</param> 
/// <param name="password"></param> 
private void SetTroposPassword(User model, string password) 
{ 

    // Create our session details 
    var sessionDetails = _troposSession.Value.Create(model.UserName); 

    // Create our anonymous session 
    using (var troposUnitOfWork = _paramatizedTroposUnitOfWork(sessionDetails)) 
    { 

     // Create our tropos user service 
     var userService = new TroposUserService(troposUnitOfWork.Value); 

     // Set our password 
     var transaction = userService.ChangePassword(password); 

     // Save our changes 
     troposUnitOfWork.Value.RunTransaction(transaction); 
    } 
} 

最初の方法は、第2のメソッドを呼び出すが、ブロックを使用しません。私はTroposUnitOfWork disposeメソッドにブレークポイントを設定し、一度だけヒットします。コンストラクタも一度だけヒットします。 誰にも分かりますか?

+0

でデコレータや工場を使用して同様の問題を解決してきました。どのクラスにCreateTroposUserAsyncメソッドがありますか?そのクラスの教師を見る必要があります。なぜあなたは新しいことをするのですか? –

答えて

0

_paramatizedTroposUnitOfWorkの初期化を確認する必要があります。 どのクラスにCreateTroposUserAsyncメソッドがありますか?そのクラスのコンストラクタを見る必要があります。あなたの全体的な目標は、作業単位の実装を取得することです。

コンストラクタを1回だけヒットした理由は、登録時に使用したためです。所有している場合。次に、2つの方法はおそらく同じ有効期間内で実行され、依存関係は1回だけ解決されます。別の言い方をすれば、_paramatizedTroposUnitOfWork(sessionDetails)は同じインスタンスを返します。

私たちは_paramatizedTroposUnitOfWorkの初期化を参照してくださいする必要があり

public interface IEventHandlerFactory<in TNotification> where TNotification 
    : class, IAsyncNotification 
{ 
    IAsyncNotificationHandler<TNotification> Create(ILifetimeScope 
                  lifetimeScope); 
} 

public class EventHandlerFactory<TNotification, TEventHandler> : 
     IEventHandlerFactory<TNotification> 
     where TNotification : class, IAsyncNotification 
     where TEventHandler : class, IAsyncNotificationHandler<TNotification> 
{ 
    public IAsyncNotificationHandler<TNotification> Create(ILifetimeScope 
        lifetimeScope) 
    { 
     return lifetimeScope.ResolveNamed<TEventHandler>("EventHandler") 
         as IAsyncNotificationHandler<TNotification>; 
    } 
} 

完全な.NETフィドルがここhttps://dotnetfiddle.net/fw4IBw

関連する問題