Создание объекта, который принимает Resolve <Interface> - PullRequest
0 голосов
/ 28 августа 2018

Я получаю сообщение об ошибке, что область не существует в текущем контексте, когда я звоню await SendAsync(activity, scope => new TransferToAgentDialog(scope.Resolve<IUserToAgent>())). Область должна передать scope.Resolve<IUserToAgent>, когда она инициализирует новый TransferToAgentDialog класс.

Я попытался инициализировать область действия:

public TransferToAgent scope = new TransferToAgent(scope.Reslove<IUserToAgent>); 

Это, однако, создает проблему, состоящую в том, что вы не можете передать scope.Resolve<IUserToAgent> при инициализации scope.

public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
    if (activity.Type == ActivityTypes.Message)
    {
        await SendAsync(activity, scope => new TransferToAgentDialog(scope.Resolve<IUserToAgent>()));
    }
    else
    {
        HandleSystemMessage(activity);
    }
    var response = Request.CreateResponse(HttpStatusCode.OK);
    return response;
}

Класс SendAsync

private async Task SendAsync(IMessageActivity toBot, Func<ILifetimeScope, IDialog<object>> MakeRoot, CancellationToken token = default(CancellationToken))
{
    using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, toBot))
    {
        DialogModule_MakeRoot.Register(scope, () => MakeRoot(scope));
        var task = scope.Resolve<IPostToBot>();
        await task.PostAsync(toBot, token);
    }
}

1 Ответ

0 голосов
/ 29 августа 2018

Вы можете инициировать область видимости следующим образом:

using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, activity))
    {
        await SendAsync(activity, () => new TransferToAgentDialog(scope.Resolve<IUserToAgent>()));                       
    }
...