Насколько глубоко я должен пойти на занятия, чтобы правильно подключить Castle Windsor для DI? - PullRequest
0 голосов
/ 03 ноября 2010

Правильно, я новичок в Касле и пытаюсь выяснить, как далеко мне нужно зайти, чтобы подключить услугу. Ниже приведен пример классов, с которыми я работаю и где они находятся в мире, который я создал.

alt text

Что я пытаюсь сделать, чтобы правильно подключить Castle, чтобы я мог вызывать класс TemplateEmailViaSalesforce для выполнения работы и иметь зависимые классы, подключенные через DI от Castle. Но я не уверен, как далеко я должен идти при регистрации компонентов. Ниже моя первая попытка (я регистрируюсь с помощью кода в качестве пробной версии, и это гибрид нескольких методов для создания контейнера)

IWindsorContainer container = new WindsorContainer();
        container.AddFacility<FactorySupportFacility>();

        // add the DAL mapper factory
        container.AddComponent<ITemplateMapperFactory>();

        // individual mappers
        container.Register(Component.For<ICSGEmailTemplateMapper>().UsingFactory((ITemplateMapperFactory f) => f.CSGEMailTemplate));
        container.Register(Component.For<IUserMapper>().UsingFactory((ITemplateMapperFactory f) => f.User));
        container.Register(Component.For<IGoupMapper>().UsingFactory((ITemplateMapperFactory f) => f.Group));
        container.Register(Component.For<IAccountTeamMapper>().UsingFactory((ITemplateMapperFactory f) => f.AccountTeam));
        container.Register(Component.For<ISalesTeamMapper>().UsingFactory((ITemplateMapperFactory f) => f.SalesTeam));
        container.Register(Component.For<ICSGFormulaMapper>().UsingFactory((ITemplateMapperFactory f) => f.CSGFormula));
        container.Register(Component.For<ISFObjectDefinitionMapper>().UsingFactory((ITemplateMapperFactory f) => f.SFDCObjectDefinition));
        container.Register(Component.For<ISFObjectValueMapper>().UsingFactory((ITemplateMapperFactory f) => f.SFDCObjectValue));
        container.Register(Component.For<ISalesforceTemplateMapper>().UsingFactory((ITemplateMapperFactory f) => f.Template));
        container.Register(Component.For<IRecipientMapper>().UsingFactory((ITemplateMapperFactory f) => f.Recipient));

        // BLL stuff (domain components)...general
        container.AddComponent<CSGEmailTemplateRepository, CSGEmailTemplateRepository>();
        container.AddComponent<RecipientRepository, RecipientRepository>();
        container.AddComponent<SFObjectDefinitionRepository, SFObjectDefinitionRepository>();
        container.AddComponent<SFObjectValueRepository, SFObjectValueRepository>();
        container.AddComponent<TemplateRepository, TemplateRepository>();
        container.AddComponent<UserRepository, UserRepository>();
        container.AddComponent<ITemplateService, TemplateService>();

        // specific for this action
        container.AddComponent<TemplateEmailerViaSalesforce>();
        container.AddComponent<TemplateParse>();

        // Aspects
        container.AddComponent<TraceAspect>();

Теперь я получаю ошибку позже: container.Resolve<TemplateEmailerViaSalesforce>();

AssemblerTests.ShouldCreateTemplateService : FailedTest method Tests.AssemblerTests.ShouldCreateTemplateService threw exception:  Castle.MicroKernel.Facilities.FacilityException: You have specified a factory ('Castle.MicroKernel.Registration.GenericFactory`1[[CSG.Salesforce.TemplateEmailer.DAL.Access.IUserMapper, CSG.Salesforce.TemplateEmailer.DAL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' - method to be called: Create) for the component 'CSG.Salesforce.TemplateEmailer.DAL.Access.IUserMapper' CSG.Salesforce.TemplateEmailer.DAL.Access.IUserMapper that failed during invoke. --->  System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. --->  Castle.MicroKernel.ComponentRegistrationException: Type CSG.Salesforce.TemplateEmailer.DAL.ITemplateMapperFactory is abstract.

Ошибка, по-видимому, связана с IUserMapper, который определен как class UserMapper:BaseSalesforceMapper<UserData>,IUserMapper

Другие мапперы работают, но я получаю сообщение об ошибке, что не все зависимости были удовлетворены, и мне нужна регистрация IUserMapper для полного удовлетворения.

Как далеко я должен зайти в кроличью нору, чтобы получить этот провод? На данный момент я смотрю через BLL в DAL и в базовый класс, из которого построены средства отображения приложений, и это кажется неправильным. Я изо всех сил пытаюсь выяснить, что мне нужно зарегистрировать и что будет неявно делать с DI самим Каслом.

Любая помощь будет приветствоваться. Благодаря. enter code here

Ответы [ 2 ]

3 голосов
/ 03 ноября 2010

Вот проблемы, которые я вижу в вашем коде:

  • container.AddComponent<ITemplateMapperFactory>();

    вам нужно предоставить здесь класс реализации, вот почему выполучение этого исключения при разрешении.

  • container.AddComponent<UserRepository, UserRepository>();

    Если вы регистрируете компонент без интерфейса, нет необходимости повторять тип реализации как тип службы.

  • UsingFactory() устарел.Вместо этого используйте UsingFactoryMethod().

  • AddComponent() устарело.Вместо этого используйте Register(Component.For...)).
  • В последней версии Windsor нет необходимости добавлять FactorySupportFacility для использования UsingFactoryMethod().

, что мне нужно для регистрации ичто неявно будет сделано с помощью DI самим Каслом.

Вам необходимо зарегистрировать каждый компонент , которым вы хотите управлять в Виндзоре.Если вы не зарегистрируете его, Виндзор не узнает об этом.Вы можете установить соглашения, чтобы избежать индивидуальной регистрации компонентов .Виндзор делает для вас неявную автоподстройку компонентов.

0 голосов
/ 03 ноября 2010

Я не совсем понимаю все, что вы здесь делаете. Может быть, лучше начать с нескольких уроков и предпринять шаги к тому, чтобы все было настроено так, как вы хотите. Вы также можете захотеть взглянуть на автоматическую разводку для Windsor - она ​​должна упростить настройку хотя бы некоторых ваших компонентов.

Все это говорит о том, что мне кажется, что вы указываете интерфейс, используемый для реализации вашей фабрики (ITemplateMapperFactory). Как сообщение об ошибке показывает: «ITemplateMapperFactory является абстрактным». Виндзор не может создать что-то, что не может быть создано.

Отказ от ответственности: я не являюсь экспертом на заводе, так как я им не пользуюсь.

...