Ted Elliott
Ted Elliott

Reputation: 3503

Get the corresponding View for a type from Windsor

I have the following classes defined:

public interface IShapeView
{
    void DoSomethingWithShape(Shape shape);
}
public interface IShapeView<T> where T : Shape
{
    void DoSomethingWithShape(T shape);
}

public class CircleView : IShapeView<Circle>, IShapeView
{
    public void DoSomethingWithShape(Circle shape)
    {
        MessageBox.Show("Circle:" + shape.Radius);
    }
    void IShapeView.DoSomethingWithShape(Shape shape)
    {
        DoSomethingWithShape((Circle)shape);
    }
}
public class Circle : Shape
{
    public Circle()
    {
        Radius = 1.0;
    }

    public double Radius { get; set; }
}

And the following registration:

container.Register(Component.For<IShapeView<Circle>>().ImplementedBy<CircleView>());

Is there a method that I can call to resolve a view when I only have the Type of the shape? Or do I need to go to the trouble of using reflection to create the generic type arguments to get the correct type of IShapeView that I want? Looking for something like this:

Type shapeType = typeof(Circle);
IShapeView view = (IShapeView) container.SomeResolveMethod(shapeType, typeof(IShapeView<>));

Upvotes: 2

Views: 40

Answers (1)

Krzysztof Kozmic
Krzysztof Kozmic

Reputation: 27384

There's no method built in because it's not needed. The reason why it's not needed is that in real application you never would pull the component directly from the container - you'd use a typed factory instead.

Typed factory can be easily taught to deal with this scenario. Have a look at this post.

Upvotes: 2

Related Questions