2010-03-02 2 views
1

Я открыт для других контейнеров IoC, таких как NInject и StructureMap, если они намного чище, чем это. Я слышал, что StructureMap только что представил «контейнеры», которые могут это упростить, возможно?Есть ли лучший способ использовать API Замка Виндзора для Заводов?

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

// The process to register an object, with a factory method 
var cfg = new MutableConfiguration(p.Name); 
cfg.Attributes["factoryId"] = p.TypeFactory.Name; 
cfg.Attributes["factoryCreate"] = "Create"; 
var model = _container.Kernel.ComponentModelBuilder.BuildModel(
    p.Name, p.TypeService, p.Type, null); 
model.LifestyleType = LifestyleType.Pooled; 
model.Configuration = cfg; 
_container.Kernel.AddCustomComponent(model); 

Versas "не-завод" способ добавления компонента:

// registering a component with no factory method 
_container.AddComponentLifeStyle(
    p.Name, p.TypeService, p.Type, LifestyleType.Singleton); 

Первый кажется слишком сложным.

Заранее благодарен!

+0

Вы рассматривали проверку документации перед публикацией этого вопроса? http://using.castleproject.org/display/IoC/Fluent+Registration+API#FluentRegistrationAPI-Usingadelegateascomponentfactory: –

+0

plus также класс FactorySupportFacility имеет методы, помогающие этому, если вы не хотите свободного API. В основном вы выбрали наименее оптимальный способ сделать это. –

+0

Привет, Krzysztof, и благодарю вас за комментарии. Забавно, я никогда не видел ссылки на документацию о замке - так как любые ссылки там идут на такие страницы: http://api.castleproject.org/ Прямо со своего сайта. Спасибо, что связали меня с фактической документацией (но, пожалуйста, будьте добры в своих комментариях в будущем). – eduncan911

ответ

3

Я не уверен, что вы пытаетесь зарегистрировать (то, что p в первом блоке кода?), Но с UsingFactoryMethod, регистрация завода - это бриз. Образец кода:

container.AddFacility<FactorySupportFacility>() 
    .Register(
     Component.For<IMyService>() 
     .UsingFactoryMethod(() => MyLegacyServiceFactory.CreateMyService()) 
     .LifeStyle.Pooled 
    ); 
+0

Привет, Маурицио! Вау, это упрощает вещи. В качестве комментария к упомянутому выше вопросу, похоже, другое место для документализации, хотя основной сайт проекта Castleproject указывает на это: http://api.castleproject.org/ Спасибо. Отмечено как ответ. О, а «p» - из запроса Linq. не должно было иметь значения. – eduncan911

+1

IOU улучшение страницы загрузки. Я не забыл :) –