8

Castle Dynamic Proxyでプロキシするクラスがあります。いくつかのカスタム属性をプロキシ メソッド (プロキシされたクラスでは定義されていません) に追加したいと考えています。これは可能ですか?

アプリケーションのサービス層用に ASP.NET Web API 層を生成したいので、これが必要です。私はサービスをプロキシしました (ApiController と追加の IMyService インターフェイスから継承して)、それはうまく機能しますが、WebAPI 固有の属性をこの新しく作成された動的クラスに追加したいので、Web API フレームワークはそれらを読み取ることができます。

編集

誰かが私が実際に何を望んでいるのか知りたい場合は、詳細に説明したいと思います.

public interface IMyService
{
    IEnumerable<MyEntity> GetAll();
}

public class MyServiceImpl : IMyService
{
    public IEnumerable<MyEntity> GetAll()
    {
        return new List<MyEntity>(); //TODO: Get from database!
    }
}

public class MyServiceApiController : ApiController,IMyService
{
    private readonly IMyService _myService;

    public MyServiceApiController(IMyService myService)
    {
        _myService = myService;
    }

    public IEnumerable<MyEntity> GetAll()
    {
        return _myService.GetAll();
    }
}

MyServiceImpl によって実装された IMyService があるとします。そして、Webからこのサービスを利用できるようにApiコントローラーを作りたいです。しかし、ご覧のとおり、API コントローラーは実際のサービスの単なるプロキシです。では、なぜそれを書く必要があるのでしょうか。Castle Windsor を使用して動的に作成できます。

これは私のアイデアであり、私の新しいプロジェクト ( https://github.com/hikalkan/aspnetboilerplate ) でほぼ完了しました。しかし、API コントローラーの GetAll メソッドに属性 (Authorize など) を追加する必要がある場合はどうでしょう。そのようなクラスがないため、直接追加することはできません。城の動的プロキシです。

だから、この問題の横に。シナミック プロキシ クラスのメソッドに属性を追加できるかどうかを知りたいです。

4

2 に答える 2

2

そのプロジェクトをもう一度参照して ください https://github.com/aspnetboilerplate/aspnetboilerplate/issues/55 IService で RoutePrefix を定義し、アクションで RoutePrefix を定義できるようにする方法も知りたいです。幸いなことに、プロキシのカスタム属性を定義する方法がようやくわかりました。

public class CustomProxyFactory : DefaultProxyFactory
{
    #region Overrides of DefaultProxyFactory

    protected override void CustomizeOptions(ProxyGenerationOptions options, IKernel kernel, ComponentModel model, object[] arguments)
    {
        var attributeBuilder = new CustomAttributeBuilder(typeof(DescriptionAttribute).GetConstructor(new[] { typeof(string) }), new object[] { "CustomizeOptions" });
        options.AdditionalAttributes.Add(attributeBuilder);
    }

    #endregion
}

/// <summary>
/// 用户信息服务
/// </summary>
[Description("IUserInfoService")]
public interface IUserInfoService
{
    /// <summary>
    /// 获取用户信息
    /// </summary>
    /// <param name="name"></param>
    /// <returns></returns>
    [Description("IUserInfoService.GetUserInfo")]
    UserInfo GetUserInfo([Description("IUserInfoService.GetUserInfo name")] string name);
}

/// <summary>
/// 用户信息服务
/// </summary>
[Description("UserInfoService")]
public class UserInfoService : IUserInfoService
{
    /// <summary>
    /// 获取用户信息
    /// </summary>
    /// <param name="name"></param>
    /// <returns></returns>
    [Description("UserInfoService.GetUserInfo")]
    public virtual UserInfo GetUserInfo([Description("UserInfoService.GetUserInfo name")] string name)
    {
        return new UserInfo { Name = name };
    }
}

using DescriptionAttribute = System.ComponentModel.DescriptionAttribute;
[TestFixture]
public class AttributeTests
{
    /// <summary>
    /// Reference to the Castle Windsor Container.
    /// </summary>
    public IWindsorContainer IocContainer { get; private set; }
    [SetUp]
    public void Initialize()
    {
        IocContainer = new WindsorContainer();
        IocContainer.Kernel.ProxyFactory = new CustomProxyFactory();
        IocContainer.Register(
            Component.For<UserInfoService>()
                .Proxy
                .AdditionalInterfaces(typeof(IUserInfoService))
                .LifestyleTransient()
            );

    }

    /// <summary>
    /// 
    /// </summary>
    [Test]
    public void GetAttributeTest()
    {
        var userInfoService = IocContainer.Resolve<UserInfoService>();
        Assert.IsNotNull(userInfoService);
        var type = userInfoService.GetType();
        Assert.IsTrue(type != typeof(UserInfoService));
        var attribute = type.GetCustomAttribute<DescriptionAttribute>();
        Assert.IsTrue(attribute != null);
        Trace.WriteLine(attribute.Description);

        var method = type.GetMethod("GetUserInfo");
        attribute = method.GetCustomAttribute<DescriptionAttribute>();
        Assert.IsTrue(attribute != null);
        Trace.WriteLine(attribute.Description);

        var parameter = method.GetParameters().First();
        attribute = parameter.GetCustomAttribute<DescriptionAttribute>();
        Assert.IsTrue(attribute != null);
        Trace.WriteLine(attribute.Description);
    }
}
于 2015-08-31T08:43:05.720 に答える