2013-04-26 3 views
1

Поскольку Autofac не работает над Mono, я пытаюсь перейти на среду Windsor IoC. Я хочу найти dll для реализации моего интерфейса IDataLoader и разрешить все экземпляры.Список и разрешение реализаций интерфейса [Виндзорский замок]

вот мой код разрешения:

var container = new WindsorContainer(); 

System.Reflection.Assembly asm = System.Reflection.Assembly.LoadFrom("/home/konrad/DataLoader.dll"); 
container.Register(AllTypes.FromAssembly(asm)); 
IDataLoader loader = container.Resolve<IDataLoader>(); 

Интерфейс выглядит следующим образом:

namespace Viewer.Core.Data 
{ 
    public interface IDataLoader 
    { 
     PointControl[] GetPositionData(string filePath); 
    } 
} 

и реализация:

using OpenTK; 
using System; 
using System.Collections.Generic; 
using System.Globalization; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Viewer.Core.Data; 
using Castle.Windsor; 
using Castle.MicroKernel.Registration; 

namespace DataLoader 
{ 
    public class StandardDataLoader : IDataLoader 
    { 
     public StandardDataLoader() 
     { 
     } 

     public PointControl[] GetPositionData(string filePath) 
     { 
      return CreateCloud(filePath); 
     } 

     private PointControl[] CreateCloud(string path) 
     { 
      //loading data from file code 
      return points; 
     } 
    } 
} 

После разрешения я получаю сообщение об ошибке:

{Castle.MicroKernel.ComponentNotFoundException: No component for supporting the service Viewer.Core.Data.IDataLoader was found at Castle.MicroKernel.DefaultKernel.Castle.MicroKernel.IKernelInternal.Resolve (System.Type service, IDictionary arguments, IReleasePolicy policy) [0x00000] in <filename unknown>:0 at Castle.MicroKernel.DefaultKernel.Resolve (System.Type service, IDictionary arguments) [0x00000] in <filename unknown>:0 at Castle.Windsor.WindsorContainer.Resolve[IDataLoader]() [0x00000] in <filename unknown>:0 at (wrapper remoting-invoke-with-check) Castle.Windsor.WindsorContainer:Resolve() at ViewerMultiplatform.DataModel.LoadModel (System.String modelPath) [0x00027] in /home/konrad/hg/ViewerPrototype/OpenTKMultithread/ViewerMultiplatform/Models/DataModel.cs:103 } 

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

+0

Я думаю, вам нужно указать '.WithService.FirstInterface()' или в зависимости от того опция '.WithService' актуальна - в основном вы добавляете компоненты, но вам нужно зарегистрировать связанные с ними услуги – Charleh

+0

(Я думаю, что имя 'AllTypes' упоминается как вводящее в заблуждение, это то же самое, что и' Classes') – Charleh

+0

Это какая-то другая сборка? Я не вижу этого после .FromAssembly (asm) –

ответ

1

Я не думаю, что AllTypes.FromThisAssembly() на своем собственном фактически регистрирует что-нибудь ...

Попробуйте Pick()

container.Register(AllTypes.FromThisAssembly() 
      .Pick()); 

Я все еще не 100% на Fluent API, хотя еще :)

Это, кажется, очистить его:

Castle Windsor Fluent Registration - What does Pick() do?

Таким образом, вы можете использовать Pick() или AllTypes().Of<object>() - с указанием AllTypes() без выбора каких-либо типов фактически не добавлять любые типы в контейнер

Кроме того, необходимо указать службы, что компоненты реализации:

container.Register(AllTypes.FromThisAssembly() 
      .Pick().WithService.FirstInterface()); 

или

container.Register(AllTypes.FromThisAssembly() 
      .Pick().WithService.DefaultInterfaces()); 
+0

Спецификация пространства имен не очень удобна, но она работает спасибо Charleh, regards, K. –

+0

Ваш ответ с указанием DefaultInterface был полезен , но теперь я не вижу его после вашего последнего редактирования, и я уже отметил его как принятый –

+0

А, я верну его, я думаю, что оба необходимы – Charleh