簡體   English   中英

autofac和擁有的實例

[英]autofac and owned instances

我一直在討論擁有的實例,並且需要設置一個實例。 http://docs.autofac.org/en/latest/advanced/owned-instances.html

我在同一類中有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);
}

因此,我的理解是,如果我使用using塊,那么工作單元將在調用結束時處理。 但事實並非如此。 就像我之前提到的,我有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);
    }
}

第一種方法確實調用第二種方法,但是在using塊之外。 我在TroposUnitOfWork dispose方法中放置了一個斷點,它只被命中一次。 構造函數也只被擊中一次。 有人知道為什么嗎?

我們需要查看_paramatizedTroposUnitOfWork的初始化。 哪個類具有CreateTroposUserAsync方法? 我們需要查看該類的構造函數。 我想您的總體目標是獲得一個工作單元實施。

之所以只點擊一次構造函數,可能是由於注冊時使用的壽命。 如果擁有。 然后,這兩種方法可能在相同的生存期范圍內執行,並且依賴性僅被解析一次。 或換句話說,_paramatizedTroposUnitOfWork(sessionDetails)返回相同的實例。

我已經使用裝飾器和工廠解決了類似的問題

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM