That would work too. However, while I may be biased, I think the solution I posted on SO (http://stackoverflow.com/questions/7651390/delayed-lazy-resolve) has the benefit of less maintenance. If you add more exporters, just register them with a new name and you're all set. No need to maintain your own factory -- let Windsor do it. :)
--- Patrick Steele http://weblogs.asp.net/psteele On Wed, Oct 12, 2011 at 3:05 AM, smolesen <[email protected]> wrote: > I ended up using the following: > > using System; > using Castle.MicroKernel.Registration; > using Castle.Windsor; > using Microsoft.VisualStudio.TestTools.UnitTesting; > > namespace GPI.REST.UnitTest > { > public interface IMyContext > { > string subtype { get; set; } > } > > public class MyContext : IMyContext > { > public string subtype { get; set; } > } > > public interface IMyExporter > { > string Export(); > } > > public class MyExporterXML : IMyExporter > { > public string Export() > { > return "XML Data"; > } > } > > public class MyExporterJson : IMyExporter > { > public string Export() > { > return "JSON Data"; > } > } > > public class MyExporterFactory > { > private IMyContext context; > public MyExporterFactory(IMyContext context) > { > this.context = context; > } > > public Func<IMyExporter> Create() > { > return () => > { > if (context.subtype == "XML") > return new MyExporterXML(); > return new MyExporterJson(); > }; > > } > } > > public class MyService > { > private readonly Func<IMyExporter> exporter; > public MyService(Func<IMyExporter> exporter) > { > this.exporter = exporter; > } > public string Extractdata() > { > return exporter().Export(); > } > } > > > [TestClass] > public class UnitTest2 > { > public Func<IMyExporter> CreateExporter() > { > Func<IMyExporter> smo = null; > return smo; > } > > [TestMethod] > public void TestMethod1() > { > // Arrange > var container = new WindsorContainer(); > > container.Register(Component.For<IMyContext>().ImplementedBy<MyContext>()); > container.Register(Component.For<MyService>()); > container.Register(Component.For<MyExporterFactory>()); > > container.Register(Component.For<Func<IMyExporter>>().UsingFactoryMethod(kernel > => kernel.Resolve<MyExporterFactory>().Create())); > var context = container.Resolve<IMyContext>(); > var service = container.Resolve<MyService>(); > > // Act > context.subtype = "JSON"; > var resultJson = service.Extractdata(); > > context.subtype = "XML"; > var resultXml = service.Extractdata(); > > // Assert > Assert.AreEqual(resultJson, "JSON Data"); > Assert.AreEqual(resultXml, "XML Data"); > } > } > } > > -- > You received this message because you are subscribed to the Google Groups > "Castle Project Users" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/castle-project-users?hl=en. > > -- You received this message because you are subscribed to the Google Groups "Castle Project Users" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/castle-project-users?hl=en.
