我可以选择 Unity 使用哪个构造函数吗?
Can I choose which constructor Unity will use?
是否可以在 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 使用这个特定的构造函数?
当您对 game/program 中的状态使用不同的构造函数时,这是一个奇怪的构造。如果你想传递两种不同的 class 类型,你可以使用继承。您需要一个共同的祖先,因为 InputOne
和 InputTwo
仅共享 Object
作为共同的祖先。所以你需要指定一个new base class。在这个基数 class 中,你写下普通的 functionality/definition.
这是一个例子:
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();
}
}
是否可以在 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 使用这个特定的构造函数?
当您对 game/program 中的状态使用不同的构造函数时,这是一个奇怪的构造。如果你想传递两种不同的 class 类型,你可以使用继承。您需要一个共同的祖先,因为 InputOne
和 InputTwo
仅共享 Object
作为共同的祖先。所以你需要指定一个new base class。在这个基数 class 中,你写下普通的 functionality/definition.
这是一个例子:
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();
}
}