C# 解析类型时的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;

使用Unity,我希望执行一个方法来返回一个实例,该实例应该在每次解析类型时注入构造函数

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构造函数不能更改