从Unity到Autofac和子范围的Service Fabric DI实现

时间:2016-11-21 19:27:49

标签: autofac azure-service-fabric

我目前正在将一个Service Fabric DI实现从Unity移植到Autofac,我需要一些建议。

原始实施:

https://github.com/s-innovations/S-Innovations.ServiceFabric.DependencyInjection

Unity实现延迟在ActorFactory中注册两个依赖项,然后在Actor范围内使用DI容器。

我正在考虑使用Autofac执行此操作的最佳方式。

我需要创建一个新的ContainerBuilder,并使用命名范围注册两个Actor Scoped依赖项(可能使用ActorId作为范围Id?),以便实例是这个范围的特别是演员实例。

这是我到目前为止所做的:

  public static ILifetimeScope WithActor<TActor>(this Container container,
        ActorServiceSettings settings = null) where TActor : ActorBase
    {
        ContainerBuilder builder = new ContainerBuilder();

        if (!container.IsRegistered<IActorDeactivationInterception>())
        {
            builder.RegisterType<OnActorDeactivateInterceptor>()
                .As<IActorDeactivationInterception>()
                .EnableInterfaceInterceptors();

            builder.Update(container);
        }

        builder.Register(c => ActorProxyTypeFactory.CreateType<TActor>())
            .As(typeof(TActor))
            .InstancePerLifetimeScope();

        builder.Update(container);

        ActorRuntime.RegisterActorAsync<TActor>((context, actorType) => {
            try
            {
                return new ActorService(context,
                    actorTypeInfo: actorType,
                    actorFactory: (service, id) =>
                        //     container.BeginLifetimeScope()
                        //         .RegisterInstance(service, new ContainerControlledLifetimeManager())
                        //         .RegisterInstance(id, new ContainerControlledLifetimeManager()).Resolve<TActor>(),
                        {

                            var actorBuilder = new
                            ContainerBuilder();

                            actorBuilder
                            .RegisterInstance(service)
                            .InstancePerDependency();

                            actorBuilder
                            .RegisterInstance(id)
                            .InstancePerDependency();

                            actorBuilder.Update(container);

                            return container.Resolve<TActor>();
                        }, settings: settings);
            }
            catch (Exception ex)
            {
                throw;
            }
        }).GetAwaiter().GetResult();

        return container;
    }

任何想法,评论最受欢迎!任何人都可以通过DI / this方法了解解决Actors及其依赖关系对性能的影响吗?

完整的代码在这里:

https://github.com/Applicita/S-Innovations.ServiceFabric.DependencyInjection/tree/Autofac/src/Applicita.ServiceFabric.Autofac

0 个答案:

没有答案