3

私のサービスはユーティリティ クラスを使用しており、そのユーティリティ クラスにはいくつかのパブリック プロパティがあります。これらのパブリック プロパティが設定されていることを確認するために呼び出す必要がある特別なものはありますか?

サービスは ASP.NET ホストを使用します。Global.ASAX 内で、新しい AppHostBase を宣言しました。

public class MyServiceHost : AppHostBase
{
    public MyServiceHost() : base("My Service Host", typeof(ServiceLibrary).Assembly) {}

    public override void Configure(Funq.Container container)
    {
        container.Register<IDbConnectionFactory>(dbConFactory);

        container.RegisterAutoWired<UtilityLibrary>();
        container.RegisterAutoWired<RepositoryLibrary>();
    }
}

私のリポジトリ ライブラリとユーティリティ ライブラリの両方にメイン クラスがあります。これにより、クラスがコンテナを受け取り、より具体的なユーティリティとリポジトリが登録される場合があります。

public class UtilityLibrary
{
    public UtilityLibrary(Funq.Container container)
    {
        container.RegisterAutoWired<WidgetAActions>();
        container.RegisterAutoWired<WidgetBActions>();
    }
}

以下の例では、RepositoryLibrary クラスのコンストラクターに WidgetARepository が設定されています。WidgetARepository を含む RepositoryLibrary クラスは、AppHost のConfigureメソッドでコンテナに提供されました (上記の最初のスニペット)。それでも、WidgetARepository (以下) は設定されません。

public class WidgetAActions
{
    public WidgetARepository WidgetARepository { get; set; }

    public WidgetA Get(string id)
    {
        var item = this.WidgetARepository.Get(id);
        if (item == null) { return null; }

        // Do something else

        return item;
    }
}

手動で呼び出す必要がありますResolve()か? これを行うと、インジェクションの目的が無効になるようです。

4

1 に答える 1

3

Funq Container Autowire IoC を ServiceStack サービスの外部で使用したい場合は、Container.AutoWire自分自身を呼び出して、コンテナーに関連する依存関係を注入させる必要があります。この呼び出しは、ServiceStack 要求パイプラインの舞台裏で行われます。

ServiceStack v4 の場合:

HostContext.Container.AutoWire(objectToPopulate);

ServiceStack v3 の場合:

AppHostBase.Instance.Container.AutoWire(objectToPopulate);

通常、この呼び出しを、インジェクションを設定するオブジェクトのコンストラクター メソッドに追加します。だからあなたの場合:

public class WidgetAActions
{
    public WidgetARepository WidgetARepository { get; set; }

    public WidgetAActions()
    {
        // (Substitute with v3 usage if required.)
        HostContext.Container.AutoWire(this);
    }

    ...
}

お役に立てれば。


編集:コンテナに対応するリポジトリをWidgetAActionsのコンストラクタに注入することを検討しましたか?

container.RegisterAutoWired<WidgetAActions>(c => new WidgetAActions(c.Resolve<WidgetARepository>()));

public class WidgetAActions
{
    public WidgetARepository WidgetARepository { get; private set; }

    public WidgetAActions(WidgetARepository repository)
    {
        WidgetARepository = repository;
    }

    ...
}

編集:または、オブジェクトのパブリック プロパティを解決してリポジトリに設定すると、コンストラクターが不要になります。

container.RegisterAutoWired<WidgetAActions>(c => 
    new WidgetAActions { WidgetARepository = c.Resolve<WidgetARepository>() }
);

public class WidgetAActions
{
    public WidgetARepository WidgetARepository { get; set; }

    ...
}

または、解決時に autowire を呼び出すことができますWidgetAActions:

container.RegisterAutoWired<WidgetAActions>(c => {
    var actions = new WidgetAActions();
    container.AutoWire(actions); // All dependencies injected
    return actions;
});

public class WidgetAActions
{
    public WidgetARepository WidgetARepository { get; set; }

    ...
}
于 2014-02-16T19:58:49.593 に答える