I'm working on a C# project. I'm trying to get rid of a Factory class that has a large switch
statement.
I want to configure Autofac to be able to construct a dependency based on a parameter, thereby allowing Autofac to take the place of the Factory.
I've looked at the DelegateFactories page of the Autofac wiki, but I can't figure out how to apply the pattern to an abstract class. Here's some code showing the situation:
public enum WidgetType
{
Sprocket,
Whizbang
}
public class SprocketWidget : Widget
{
}
public class WhizbangWidget : Widget
{
}
public abstract class Widget
{
public delegate Widget Factory(WidgetType widgetType);
}
public class WidgetWrangler
{
public Widget Widget { get; private set; }
public WidgetWrangler(IComponentContext context, WidgetType widgetType)
{
var widgetFactory = context.Resolve<Widget.Factory>();
Widget = widgetFactory(widgetType);
}
}
I'd like it if I were to say new WidgetWrangler(context, WidgetType.Sprocket)
, its Widget
property would be a SpocketWidget
.
When I try this, I get errors stating that Widget.Factory
is not registered. Does this delegate factory pattern not work with abstract classes, and if so, is there another way to accomplish this?
What you're looking for is the
IIndex<,>
Relationship Type.If you register your sub-classes with
.Keyed<>(...)
you can key a registration to a value (object
).For example:
Then you only require a dependency of
IIndex<WidgetType,Widget>
to mimic factory behaviour.That's using Dependency Injection approach, if you just want to resolve the factory: