2 votes

Comment gérer les scopes de durée de vie dans les services WCF sans utiliser directement ILifetimeScope ?

Voici mon service WCF simple qui a été intégré avec Autofac.Wcf :

[ServiceContract]
public class MyService
{
    private readonly IResponseBuilder _responseBuilder;
    private readonly IEnumerable<IOperation> _operations;

    public MyService(IResponseBuilder responseBuilder, IEnumerable<IOperation> operations)
    {
        _responseBuilder = responseBuilder;
        _operations = operations;
    }

    [OperationContract]
    public object Execute()
    {
        foreach (var operation in _operations)
        {
            operation.Execute();
        }
        return _responseBuilder.Build();
    }
}

Je veux que toutes les opérations utilisent le même instance de IResponseBuilder pour construire le résultat. Exemple d'une opération :

public class AlwaysFailOperation : IOperation
{
    private readonly IOperationResultBuilder _resultBuilder;

    public AlwaysFailOperation(IOperationResultBuilder resultBuilder)
    {
        _resultBuilder = resultBuilder;
    }

    public void Execute()
    {
        _resultBuilder.Fail();
    }
}

Je sais que cela peut être réalisé avec ILifetimeScope o IContainer à l'intérieur de MyService mais je veux garder tout le travail sur les conteneurs dans la composition Root.

Veuillez m'aider à répondre à ces exigences. Voici mes enregistrements actuels :

public static void AppInitialize()
{
    var builder = new ContainerBuilder();
    builder.RegisterType<MyService>();
    builder.RegisterType<ResponseBuilder>()
        .AsImplementedInterfaces();
    builder.RegisterType<AlwaysFailOperation>()
        .AsImplementedInterfaces();
    AutofacHostFactory.Container = builder.Build();
}

3voto

Travis Illig Points 6435

InstancePerLifetimeScope devrait fonctionner, mais vous devrez le tester dans votre scénario particulier.

En raison des restrictions avec les internes de WCF il n'y a aucune durée de vie par demande dans WCF. Voir le commentaire en gras en haut de la documentation. WCF est très limité en ce qui concerne ses points d'intégration DI.

Autofac crée un contexte d'instance pour chaque instance du service. Ce contexte contient une portée de vie à partir de laquelle l'instance du service est résolue. L'étendue n'est pas nommée parce que pour les services singleton le contexte d'instance vit pour la durée de vie du service - c'est contrôlé par WCF, pas Autofac.

Donc, hypothétiquement, si vous créez votre instance de service par demande dans WCF et enregistrez la dépendance comme instance par portée de vie, vous devriez obtenir le résultat que vous souhaitez. . Mais, comme toujours, testez, testez, testez. Parfois, il peut être difficile d'obtenir la bonne configuration WCF avec les bons enregistrements de durée de vie Autofac, surtout dans un système complexe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X