Constructor Injection - Do we inject factories as well?

馋奶兔 提交于 2019-12-03 12:23:29

Staying with the Door and DoorKnob example, you don't inject a factory - you inject the DooKnob itself:

public class Door
{
    private readonly DoorKnob doorKnob;

    public Door(DoorKnob doorKnob)
    {
        if (doorKnob == null)
            throw new ArgumentNullException("doorKnob");

        this.doorKnob = doorKnob;
    }
}

No factories are in sight in this level.

House, on the other hand, depends on Door, but not on DoorKnob:

public class House
{
    private readonly Door door;

    public House(Door door)
    {
        if (door == null)
            throw new ArgumentNullException("door");

        this.door = door;
    }
}

This keeps options open until at last you have to compose everything in the application's Composition Root:

var house = new House(new Door(new DoorKnob()));

You can use a DI Container to compose at this level, but you don't have to. No factories are involved.

If you inject too many factories that is a code smell called constructor over-injection that indicates your class is doing too much.

Many containers provide a feature called auto-factories. That means they generate factories of type Func<T>automatically if they know how to generate T.

Castle Windsor has an advanced feature called Typed Factory facilities which generates implementations of a factory interface on-the-fly.

There is also a port of typed factories for Unity in the TecX project.

If you end up using Unity, I have recently implemented an equivalent of Castle Windsor Typed Factories for Unity. You can find the project at https://github.com/PombeirP/Unity.TypedFactories, and the NuGet package at http://nuget.org/packages/Unity.TypedFactories.

The usage is the following:

unityContainer
    .RegisterTypedFactory<IFooFactory>()
    .ForConcreteType<Foo>();

You just have to create the IFooFactory interface with a method returning IFoo, and the rest is done for you by the library. You can resolve IFooFactory and use it to create IFoo objects straight away.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!