2013-05-08 22 views
8

Bu sorunu bir süreliğine düzeltmeye çalışıyorum ve hala akıllıca değilim.Castle Windsor Resolve çalışma saatinde

public IResult Parse(string[] args) 
{ 
    var argumentOption = new ArgumentOption(_dataModelBinder); 
    var boundArgumentOption = argumentOption.Bind(args); 

    var bindingResults = boundArgumentOption.Validate(_argumentOptionValidator); 

    // AREA OF INTEREST 
    if (bindingResults.Any()) 
    { 
     return new ErrorResult(); 
    } 

    return new CreateReportResult(
     _resultActioner 
     , boundArgumentOption.OutputFilePath 
     , boundArgumentOption.PatientId 
     , "database"); 
} 

ben sorun yaşıyorum kod ideal ben başa Kale Windsor için bırakmak istiyorum ben newing olduğum dönüş değerleri, içerir: Aşağıdaki yöntemi var. Peki, ne o zaman yaptığı bir Özet fabrika yaratmaktı:

public interface IResultFactory 
{ 
    IResult Create(int numOfErrors); 
} 

public class ResultFactory : IResultFactory 
{ 
    private readonly IWindsorContainer _container; 

    public ResultFactory(IWindsorContainer container) 
    { 
     _container = container; 
    } 

    public IResult Create(int numOfErrors) 
    { 
     if (numOfErrors > 0) 
     { 
      return _container.Resolve<IResult>("ErrorResult"); 
     } 

     return _container.Resolve<IResult>("CreateReportResult"); 
    } 
} 

ve benim Ayrıştırma yöntemi şimdi haline gelir:

nasıl olduğunu birlikte Sorunun büyük bir yaşıyorum ne
public IResult Parse(string[] args) 
{ 
    var argumentOption = new ArgumentOption(_dataModelBinder); 
    var boundArgumentOption = argumentOption.Bind(args); 

    var bindingResults = boundArgumentOption.Validate(_argumentOptionValidator); 

    IResult result = _factory.Create(bindingResults.Count()); 

    return result; 
} 

public CreateReportResult(IResultActioner resultActioner, Uri filePath, string patientId, string dataSource) 

Yani soru benim WindsorContainer yükleyici benim kayıt kodunu kurarım nasıl ve ne yaparım sonra pa: CreateReportResult için yapıcı olduğu için dinamik kayıt ve parametrelerinde geçmesi Gerekli parametrelerde ss? Castle Windsor 3.2 kullanıyorum. Sana windsor typed factory tesiste görünümlü olmalıdır düşünüyorum

container.Register(
    Component 
    .For<IResult>() 
    .ImplementedBy<ErrorResult>() 
    .Named("ErrorResult") 
    .LifeStyle.Transient 
    , Component.For<IResultFactory>() 
    .AsFactory() 
); 

container.Register(
    Component 
    .For<IResult>() 
    .ImplementedBy<CreateReportResult>() 
    .Named("CreateReportResult") 
    .LifeStyle.Transient 
    , Component.For<IResultFactory>() 
    .AsFactory() 
); 

cevap

5

: Burada

Benim kayıt var koddur. Paramaterler, kayıttaki uygulamada aynı ada sahip oldukları sürece geçilir.

+0

Merhaba Martin, Yazılı bir fabrikaya rastladım ama bunu nasıl kullanacağımı anlayamadım çünkü doğru bir şekilde kayıt işlemini nasıl yapacağımı bilmiyorum. OP'imi neye sahip olduğumu gösterme konusunda güncelledim. – DavidS

+0

Hile, yazılan fabrika varsayılan olarak bir uygulama gerektirmez olmasıdır. Bileşeninize int amountoferrors parametresi tarafından çözümlenebilmesi için, yukarıdaki bağlantıda açıklandığı gibi ITypedFactoryComponentSelector uygulamasını uygulamanız gerekir. Burada, metoddinfo ve parametrelere dayanarak çözmek istediğiniz bileşenin adını döndürebilirsiniz. Bir uygulamayı başlatmak için daha fazla parametreye ihtiyacınız varsa, fabrika için imzanın buna göre değiştirilmesi gerekir. (tüm parametrelerin fabrikaya geçirilmesi gerekir). – Martin

+2

Açıklama için teşekkürler Martin. Bu konuya ilgi duyan herkes için, http://davidsiew.wordpress.com/2013/05/08/castle-windsor-typed-factory-resolving-dependencies-at-runtime/ hakkında blog yazdım. – DavidS

İlgili konular