0

モデル オブジェクトを既存の winforms アプリと共有する mvc webapp を構築しています。それにVAB検証を導入しています。検証する必要がある項目の 1 つは、x レベルの 1 つである int です。

LevelValidator を作成しましたが、アクセス可能なレベルが必要です。

このコードの新しい呼び出しに関しては、 Levels の代わりに LevelValidator を注入する必要があるようです。他の方法?

public class LevelValidatorAttribute : ValueValidatorAttribute
{
    protected override Microsoft.Practices.EnterpriseLibrary.Validation.Validator DoCreateValidator(Type targetType)
    {
        LevelValidator validator = new LevelValidator();
        validator.Levels = this.Levels;
        return validator;
    }

    [Dependency]
    public Levels Levels { get; set; }
}
4

1 に答える 1

1

属性は依存性注入フレームワークによって制御および作成されるのではなく、CLR 自体によって制御されるため、属性に対して依存性注入を使用することはできません。属性が依存性注入を必要としない設計を試してみてください。

すべてが失敗した場合は、内部で Service Locator パターンを使用してLevelValidator(属性をそのままにしておくのが最善です)、LevelValidatorクラス内から Unity コンテナーを呼び出すことができます。これが機能するには、コンテナを保持する静的フィールドが必要です。例えば:

public class LevelValidator : Validator
{
    public static UnityContainer Container { get; set; }

    public LevelValidator()
    {
        this.Levels = Container.Resolve<Levels>();
    }

    public Levels Levels { get; set; }
}

Containerアプリケーションのスタートアップ パスで、この静的プロパティを次のように設定する必要があります。

public void Main()
{
    var container = new UnityContainer();

    // configure it

    LevelValidator.Container = container;
}

このソリューションは理想とはほど遠いものであり、ほとんどの場合、回避する必要があります。ただし、アトリビュートと の作成はLevelValidatorUnity の制御外です。

于 2011-04-19T18:16:19.857 に答える