解析类型时的Unity执行方法

时间:2013-06-10 12:30:15

标签: c# unity-container

使用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());
    }
}

2 个答案:

答案 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();
        }
    )
);