2014-11-24 3 views
3

Я пытаюсь реализовать шаблон Ninject.Extensions.Factory, и моя программа сообщает мне, что мои привязки неправильные, но я не могу понять, почему. Я продолжаю получать «Ошибка при активации IHashable. Никакие сопоставления привязки не доступны, а тип не является самопереключаемым». Соответствующие области моего кода ниже:Ninject Factory Pattern and Bindings

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."" 
      } 
     } 
    } 
} 

Я чувствую, что мои привязки настроены правильно, но я должен упустить что-то очевидное. Любые идеи, почему я получаю исключение из вышеуказанного кода?

+0

Класс «BindingObjects» отсутствует в примере кода, который вы опубликовали. – BatteryBackupUnit

+0

Я не включил этот класс, потому что он не имел отношения к проблеме, которую я имел. – Chris

ответ

3

Это связано с особенностью Ninject.Extensions.Factory. Он обрабатывает методы, начинающиеся с Get иначе, чем те, которые этого не делают. Если вы переименовали IHashableFactory.GetNew в Create или Make все работает нормально.

«Get» особенность описана here:

Поставщик instace по умолчанию расширения имеет соглашение, что он пытается вернуть экземпляр, используя именованный связывания всякий раз, когда метод начинается с «Get». Например. IFoo GetMySpecialFoo() равно

resolutionRoot.Get<IFoo>("MySpecialFoo");


Поскольку я думаю, что это не является очевидным для пользователя, и исключение не помогает вообще в связи с этим я подал отчет выпуск here

+0

Вау, я не могу поверить, что это вызвало у меня много разочарований. Очень полезно, спасибо! – Chris