以非泛型方式绑定对象工厂扩展后的异常

本文关键字:扩展 异常 工厂 对象 泛型 方式 绑定 | 更新日期: 2023-09-27 18:03:57

我有以下代码:

public interface ILogging
{ ... }
public interface ILoggingFactory
{
  ILogging CreateLogging();
}
public class MailSender : IMailSender
{
  [Inject]
  public MailSender(ILoggingFactory loggingFactory)
  {
    ...
  }
}

当我试图绑定我的工厂

Bind<ILoggingFactory>().ToFactory();

一切正常。否则,当我以非通用方式尝试

Bind(myType).ToFactory();

我得到InvalidCastException

无法强制转换"Castle.Proxies"类型的对象。ObjectProxy'的类型"MyLibrary。ILoggingFactory '

当尝试加载使用logginFactory作为:

的邮件发送器时
kernel.Get<IMailSender>();

更新:

我正在使用反射的解决方案:

MethodInfo bindMethodInfo = GetType().GetMethods()
  .First(one => one.Name == "Bind" &&
  one.IsGenericMethod).MakeGenericMethod(mType);
var bindMethodResult = bindMethodInfo.Invoke(this, null);
MethodInfo toFactoryMethodInfo = typeof(Ninject.Extensions.Factory.BindToExtensions).GetMethods()
  .First(one => one.Name == "ToFactory" && one.IsPublic && one.IsGenericMethod &&   
  one.GetParameters().Count() == 1)
  .MakeGenericMethod(mType);
toFactoryMethodInfo.Invoke(bindMethodResult, new[] { bindMethodResult });      

注释:由于项目原因,我想以非通用的方式绑定工厂

以非泛型方式绑定对象工厂扩展后的异常

如果使用

Bind(myType).ToFactory();

Ninject为工厂类型Object而不是ILoggingFactory创建代理对象。您必须另外指定工厂类型:

this.kernel.Bind(typeof(ILoggingFactory)).ToFactory(typeof(ILoggingFactory));