11

WCF サービスの依存性注入の使用をフォローアップするには、WCFバリデーターにDI を使用する方法があるので、これを行うことができます。

public class DIValidator : UserNamePasswordValidator
{
    private readonly IService service;

    [Inject]
    public DIValidator(IService service)
    {
        this.service = service;
    }

    public override void Validate(string userName, string password)
    {
        service.Login(userName, password);
    }
}

編集 - バリデーターが app.config で定義されているため、Dzmitry のアドバイスをカスタム動作拡張に適用しようとしました。悲しいことに、wcf はバリデーターにデフォルトのコンストラクターを持たせたいので、MethodMissingException が発生します。

System.MissingMethodException: No default constructor has been defined for this object.

at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)

これが私の行動クラスです:

    public class DependencyInjectionServiceBehavior : BehaviorExtensionElement, IServiceBehavior
    {
        public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        {
            serviceHostBase.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = DISupport.Kernel.Get<IService>();
        }
    }
4

2 に答える 2

3

一般に、カスタムバリデーターはプログラムで割り当てられます (構成ファイルから割り当てることもできます)。このようなもので、サービスホストが開かれる直前に行われます。基本的にこれは、さらに使用される DI コンテナーインスタンスを作成するときでもあります。インスタンスプロバイダーを介してインスタンスをサービスするには:

serviceHost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new LocalUserNamePasswordValidator();

DI コンテナを使用してカスタム バリデータを作成することもできます。

serviceHost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = unityContainer.Resolve<UserNamePasswordValidator>();
于 2009-07-24T08:05:24.890 に答える
2

これはあなたが探しているソリューションではないことはわかっていますが、IoC コンテナー (DI ではなくサービス ロケーター) から IService を取得する既定のコンストラクターを作成します。これを行う最も良い方法ではありませんが、私が考えることができる最も簡単な方法です。

編集: もちろん、テストやその他の目的で IService をモックする必要がある場合は、依存関係を注入できるコンストラクターを残すことができます。

于 2009-07-24T08:01:03.260 に答える