使用Unity我想执行一个方法来返回每次解析类型时应该注入构造函数的实例。
即。在下面的示例中,InitializeTest()仅执行一次,即定义了injectContructor。理想情况下,每次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());
}
}
答案 0 :(得分:0)
我认为您可以在从容器中解析实例时使用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);
}
答案 1 :(得分:0)
container.RegisterType<ITestClass>(new TransientLifetimeManager(),
new InjectionFactory(
c =>
{
return InitializeTest();
}
)
);