【问题标题】:Ninject Factory Pattern and BindingsNinject 工厂模式和绑定
【发布时间】:2014-11-24 04:12:29
【问题描述】:

我正在尝试实现 Ninject.Extensions.Factory 模式,我的程序告诉我我的绑定不正确,但我不知道为什么。我不断收到“激活 IHashable 时出错。没有可用的匹配绑定,并且类型不是自绑定”异常。我的代码的相关区域如下:

public interface IHashable
{
    FileInfo File { get; }

    string ComputeHash();
}

public interface IHashableFactory
{
    IHashable GetNew(FileInfo file);
}

public class MD5ChecksumProvider : IHashable
{
    private FileInfo _file;

    public FileInfo File
    {
        get { return _file; }
    }

    public MD5ChecksumProvider(FileInfo file)
    {
        if (file == null)
            throw new ArgumentNullException("file");

        _file = file;
    }

    public string ComputeHash()
    {
        // implementation
    }
}

public class AppFileProvider : IAppFileProvider
{
    private IHashableFactory _hashFactory;

    public IHashableFactory HashProvider
    {
        get { return _hashFactory; }
    }

    public AppFileProvider(IHashableFactory hashProviderFactory)
    {
        _hashFactory = hashProviderFactory;
    }

    public string GetChecksum(FileInfo fileInfo)
    {
        var hasher = _hashFactory.GetNew(fileInfo);
        return hasher.ComputeHash();
    }
}

public class BindingProviders : NinjectModule
{
    public override void Load()
    {
        Bind<IHashable>()
            .To<MD5ChecksumProvider>();
    }
}

public class BindingFactories : NinjectModule
{
    public override void Load()
    {
        Bind<IHashableFactory>()
            .ToFactory();
    }
}

// my DI container
public sealed class Container : IDisposable
{
    private bool _isDisposed;
    private IKernel _kernel;
    private BindingFactories _bindingFactories;
    private BindingObjects _bindingObjects;
    private BindingProviders _bindingProviders;

    public Container()
    {
        _isDisposed = false;

        _bindingFactories = new BindingFactories();
        _bindingObjects = new BindingObjects();
        _bindingProviders = new BindingProviders();

        _kernel = new StandardKernel(_bindingObjects, _bindingProviders, _bindingFactories);
    }

    public T Get<T>()
    {
        return _kernel.Get<T>();
    }

    public void Dispose()
    {
        // nothing worth seeing
    }

    private void Dispose(bool disposing)
    {
        // nothing worth seeing
    }
}

// the program (composition root)
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        using (var container = new Container())
        {
            var fileProvider = container.Get<IAppFileProvider>();

            foreach (var file in files)
            {
                string hash = fileProvider.GetChecksum(storePath, file); // this line throws "Error activating IHashable. No matching bindings are available, and the type is not self-bindable.""
            }
        }
    }
}

我觉得我的绑定设置正确,但我肯定遗漏了一些明显的东西。任何想法为什么我从上面的代码中得到异常?

【问题讨论】:

  • BindingObjects 您发布的示例代码中缺少类。
  • 我没有包含该课程,因为它与我遇到的问题无关。

标签: c# dependency-injection ninject factory


【解决方案1】:

这是由 Ninject.Extensions.Factory 的一个特性引起的。 它将以Get 开头的方法与不以Get 开头的方法区别对待。 如果您将 IHashableFactory.GetNew 重命名为 CreateMake 一切正常。

Get”功能描述为here

扩展的默认实例提供程序的约定是,只要方法以“Get”开头,它就会尝试使用命名绑定返回实例。例如。 IFoo GetMySpecialFoo() 等于

resolutionRoot.Get&lt;IFoo&gt;("MySpecialFoo");


由于我认为这对用户来说并不明显,并且该异常在这方面根本没有帮助,因此我提交了问题报告here

【讨论】:

  • 哇,我不敢相信这就是让我沮丧数小时的原因。很有帮助,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
相关资源
最近更新 更多