C# 解析类型时的Unity执行方法
使用Unity,我希望执行一个方法来返回一个实例,该实例应该在每次解析类型时注入构造函数C# 解析类型时的Unity执行方法,c#,unity-container,C#,Unity Container,使用Unity,我希望执行一个方法来返回一个实例,该实例应该在每次解析类型时注入构造函数 public interface ITestClass { public string GetMyNumber(); } public class TestClass : ITestClass { private int _myNumber; public TestClass(int myNumber) { _myNumber = myNumber;
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());
}
}
i、 e.在下面的示例中,InitializeTest()只执行一次,即定义InjectionContractor时。理想情况下,应该执行两次,每次解析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());
}
}
公共接口ITestClass
{
公共字符串GetMyNumber();
}
公共类TestClass:ITestClass
{
私人整数;
公共测试类(int myNumber)
{
_myNumber=myNumber;
}
公共字符串GetMyNumber()
{
返回String.Format(“我的号码是:{0}”,_myNumber);
}
}
公共类控制器
{
UnityContainer\u容器;
公共控制员()
{
初始化容器();
}
public void InitializeContainer()
{
if(_container==null)
_容器=新的UnityContainer();
RegisterType(新TransientLifetimeManager(),新InjectionConstructor(InitializeTest());
}
public int InitializeTest()
{
返回新的Random()。下一步(100);
}
public void ExecuteController()
{
ITestClass class1=_container.Resolve();
ITestClass class2=_container.Resolve();
//下面的两个语句打印相同的数字
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());
好吧,后来我用谷歌搜索了很多东西,然后我找到了我要找的东西。为清晰起见,包括以下解决方案:
container.RegisterType<ITestClass>(new TransientLifetimeManager(),
new InjectionFactory(
c =>
{
return InitializeTest();
}
)
);
container.RegisterType(新的TransientLifetimeManager(),
新注射厂(
c=>
{
返回InitializeTest();
}
)
);
然而,这意味着每次解析ITestClass时,我都必须执行额外的代码。是否无法将参数准备为IFunc并在注册时执行该代码?假设TestClass构造函数不能更改