我想使用 Unity 执行一个方法来返回一个实例,每次解析类型时都应将其注入(inject)构造函数。
即在下面的示例中,InitializeTest() 仅执行一次,即在定义 injectionContructor 时执行。理想情况下,它应该执行两次,每次 ITestClass 被解析时执行一次。
public interface ITestClass
{
public string GetMyNumber();
}
public class TestClass : ITestClass
{
private int _myNumber;
public TestClass(int myNumber)
{
_myNumber = myNumber;
}
public string GetMyNumber()
{
return String.Format("My number is: {0}", _myNumber);
}
}
public class Controller
{
UnityContainer _container;
public Controller()
{
InitializeContainer();
}
public void InitializeContainer()
{
if(_container == null)
_container = new UnityContainer();
container.RegisterType<ITestClass>(new TransientLifetimeManager(), new InjectionConstructor(InitializeTest()));
}
public int InitializeTest()
{
return new Random().Next(100);
}
public void ExecuteController()
{
ITestClass class1 = _container.Resolve<ITestClass>();
ITestClass class2 = _container.Resolve<ITestClass>();
// both statements below print the same number
Console.WriteLine(class1.GetMyNumber());
Console.WriteLine(class2.GetMyNumber());
}
}
最佳答案
我认为您可以在从容器解析实例时使用 ParameterOverride。
ITestClass class1 = container.Resolve<ITestClass>(
new ParameterOverride("myNumber", InitializeTest());
ITestClass class2 = container.Resolve<ITestClass>(
new ParameterOverride("myNumber", InitializeTest());
您还应该只创建 Random 类的一次实例并重用它。否则你也会得到相同的数字。
private Random _random = new Random();
public int InitializeTest()
{
return _random.Next(100);
}
关于c# - 解析类型时Unity执行方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17023940/