Ninject拦截动态代理问题

发布于 2024-12-26 12:09:30 字数 1373 浏览 1 评论 0原文

我正在尝试设置拦截以与 Ninject 一起使用,我们已经将 Ninject 用作​​依赖注入框架一段时间了。

我已经从 NuGet 下载了拦截扩展,并尝试使用 Castle Dynamicproxy 实现和 LinFu 实现,但都无法与我们的应用程序一起使用。

Castle 在没有无参数构造函数的类上创建代理时出错,因为所有服务对象都通过构造函数注入其依赖项,这是一个问题。错误是:

System.ArgumentException:无法实例化类的代理:emedia.RapidSystems.Subscriber.Presenters.RRSubmissionPresenter。 找不到无参数构造函数。 参数名称:constructorArguments

LinFu 拦截器工作得更好,直到代码调用带有泛型参数的方法,然后它给了我以下内容:

System.ArgumentException:泛型类型无效。 参数名称:methodInfo

这是我尝试拦截的类之一的简化​​版本代码:

[LogCalls]
public class Repository<T> : IRepository<T>
        where T : class
{   
    public virtual T GetEntity<TKey>(ObjectContext context, TKey key)
    {
        var entity = GetEntity(context, key, _emptyLoadingStrategy);
        return entity;
    }

    public virtual IQueryable<T> GetAll(ObjectContext context)
    {
        var query = GetAll(context, _emptyLoadingStrategy);
        return query;
    }

    public virtual T Add(ObjectContext context, T entity)
    {
        context.AddObject(EntitySetName(context), entity);
        return entity;
    }

     //other code goes here

}

Add 和 GetAll 工作正常,但在代理上调用 GetEntity 时会发生错误。

此时我陷入了困境,因为这两个拦截器都不适用于代码库。有没有人让 Ninject 拦截与真正复杂的生产系统一起工作,而不是简单的演示类,如果是的话,如何实现?我不介意使用哪个拦截器,只要它有效即可。

或者 Ninject 的拦截还不够成熟,我是否需要考虑用 Unity 之类的其他东西替换整个东西?

I'm trying to set up interception to work with Ninject which we have been using as our dependency injection framework for a while.

I have downloaded the interception extension from NuGet and tried it with both the Castle Dynamicproxy implementation and the LinFu implementation but could not be either to work with our applications.

Castle gave an error when creating a proxy on a class that did not have a parameterless constructor, since all the service objects have their dependencies injected via the constructor this is a problem. The error is:

System.ArgumentException: Can not instantiate proxy of class: emedia.RapidSystems.Subscriber.Presenters.RRSubmissionPresenter.
Could not find a parameterless constructor.
Parameter name: constructorArguments

The LinFu interceptor worked better, right up until the code called a method with a generic parameter then it gave me the following:

System.ArgumentException: Generic types are not valid.
Parameter name: methodInfo

Here is a simplified version code for one of the classes I am trying to intercept:

[LogCalls]
public class Repository<T> : IRepository<T>
        where T : class
{   
    public virtual T GetEntity<TKey>(ObjectContext context, TKey key)
    {
        var entity = GetEntity(context, key, _emptyLoadingStrategy);
        return entity;
    }

    public virtual IQueryable<T> GetAll(ObjectContext context)
    {
        var query = GetAll(context, _emptyLoadingStrategy);
        return query;
    }

    public virtual T Add(ObjectContext context, T entity)
    {
        context.AddObject(EntitySetName(context), entity);
        return entity;
    }

     //other code goes here

}

Add and GetAll work fine but the error happens when GetEntity is called on the proxy.

At this point I'm stuck, as neither interceptor works with the code base. Has anyone got Ninject interception working with a real complex production system, rather than a simple demo class, and if so how? I don't mind which interceptor I use as long as it works.

Or is interception with Ninject just not mature enough yet, and do I need to look at replacing the whole thing with something else like Unity?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

靑春怀旧 2025-01-02 12:09:30

使用版本 3.0.0-rc2。它向动态代理添加了对接口代理的支持

Use version 3.0.0-rc2. it adds support for interface proxies to dynamic proxy

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文