首页 > 解决方案 > 我可以选择 Unity 使用哪个构造函数吗?

问题描述

是否可以在 Unity Resolve 中指定 Unity 应该使用哪个构造函数?

我试图创建的对象可能看起来像这样:

public class MyObject
{
    [UseWhenSunny]
    public MyObject(InputOne one)
    {
        Console.WriteLine("Chose constructor one");
    }

    [UseWhenRaining]
    public MyObject(InputTwo two)
    {
        Console.WriteLine("Chose constructor two");
    }
}

public class InputOne
{
}

public class InputTwo
{
}

我的构造可能是这样的:

        var container = new UnityContainer();
        container.RegisterInstance(new InputTwo());
        var myObject = container.Resolve<MyObject>();

我可以很容易地找到正确的 ConstructorInfo,但我还没有弄清楚如何强制 Unity 使用这个特定的构造函数?

标签: c#unity-container

解决方案


当您对游戏/程序中的状态使用不同的构造函数时,这是一个奇怪的构造。如果你想传递两种不同的类类型,你可以使用继承。您需要一个共同的祖先,因为InputOne并且InputTwoObject作为共同的祖先共享。所以你需要指定一个的基类。在这个基类中,您编写通用功能/定义。

这是一个例子:

public abstract class InputBase
{
    public abstract void Show();
}

public class InputOne : InputBase
{
    public override void Show()
    {
        Console.WriteLine("Show one");
    }

}

public class InputTwo : InputBase
{
    public override void Show()
    {
        Console.WriteLine("Show two");
    }
}

public class MyObject
{
    public MyObject(InputBase input)
    {
        // because InputOne and InputTwo can be casted to their base class
        // they both can be passed as InputBase.
        // InputBase defines the Show method which their derived ones must
        // implement (abstract).
        input.Show();
    }
}

请参阅继承(C# 编程指南)


推荐阅读