0

ソリューションのいくつかのサービスで使用するアセンブリでサービス登録を再利用しようとしています。NServiceBus Web サイトにリストされている例に従って、ソリューションを実装します。それに従うと、IWantCustomInitialization インターフェイスを追加しない限り、Init メソッド (および IoC コンテナーの実装) が機能しないように見えます。そのインターフェースを実装すると、例外が発生します(ここここの SO の質問にリストされています)。例外がなく、MessageHandler の依存関係が適切に設定されていることを機能させることができないようです。これが私の現在の EndpointConfig 実装です。

[EndpointSLA("00:00:30")]
public class EndpointConfig : IConfigureThisEndpoint, AsA_Server, UsingTransport<Msmq>, INeedInitialization {
    public void Init() {
        Configure.With().ObjectBuilderAdapter();
    }
}
public class ObjectBuilderAdapter : IContainer {
    readonly IDependencyInjector injector;

    public ObjectBuilderAdapter(IDependencyInjectionBuilder dependencyInjectionBuilder) {
        injector = dependencyInjectionBuilder.Create(); //This method does all the common service registrations that I am trying to re-use
        //injector.RegisterType<ExtractIncomingPrincipal, PrincipalExtractor>();
    }

    public void Dispose() {
        injector.Dispose();
    }

    public object Build(Type typeToBuild) {
        return injector.Resolve(typeToBuild);
    }

    public IContainer BuildChildContainer() {
        return new ObjectBuilderAdapter(new DependencyInjectorBuilder());
    }

    public IEnumerable<object> BuildAll(Type typeToBuild) {
        return injector.ResolveAll(typeToBuild);
    }

    public void Configure(Type component, DependencyLifecycle dependencyLifecycle) {
        injector.RegisterType(component);
    }

    public void Configure<T>(Func<T> component, DependencyLifecycle dependencyLifecycle) {
        injector.RegisterType(component);
    }

    public void ConfigureProperty(Type component, string property, object value) {
        if (injector is AutofacDependencyInjector) {
          ((AutofacDependencyInjector)injector).ConfigureProperty(component, property, value);
        } else {
            Debug.WriteLine("Configuring {0} for property {1} but we don't handle this scenario.", component.Name, property);
        }
    }

    public void RegisterSingleton(Type lookupType, object instance) {
        injector.RegisterInstance(lookupType, instance);
    }

    public bool HasComponent(Type componentType) {
        return injector.IsRegistered(componentType);
    }

    public void Release(object instance) { }
}

public static class Extensions { public static Configure ObjectBuilderAdapter(この Configure config) { ConfigureCommon.With(config, new ObjectBuilderAdapter(new DependencyInjectorBuilder())); 設定を返します。} }

注: INeedInitialization インターフェイスを使用すると、IStartableBus を探しているときに ComponentNotRegisteredException が発生します。

4

1 に答える 1

0

組み込みコンテナーを交換しようとしている場合は、IConfigureThisEndpoint を実装する同じクラスに IWantCustomInitialization を実装する必要があります。

独自のコンテナを使用してそこにすべてのタイプを登録し、NSB にそのコンテナを使用するように指示できます。

例えば:

 public class EndpointConfig : IConfigureThisEndpoint, AsA_Server, IWantCustomInitialization
{
    public void Init()
    {
        var container = new ContainerBuilder().Build();
        Configure.With()
            .AutofacBuilder(container);
    }
}
于 2013-09-04T21:01:38.107 に答える