gpt4 book ai didi

c# - UnityContainer.RegisterType 在放入静态构造函数时不会被使用

转载 作者:太空宇宙 更新时间:2023-11-03 16:30:35 25 4
gpt4 key购买 nike

这是一个示例控制台应用程序(添加 Unity NugGet 包后它将运行良好)似乎显示了 Unity 中的错误:

using System;
using Microsoft.Practices.Unity;

class GC { public static UnityContainer Container = new UnityContainer();}

class Program
{
static void Main(string[] args)
{
GC.Container.RegisterType<MyView>();
var myView = GC.Container.Resolve<MyView>();
Console.ReadLine();
}
}

public class MyClassDesign: MyClass{}
public class MyClass: VMBase<MyClass, MyClassDesign>{}
public abstract class VMBase<TViewModel, TDesignVM> where TDesignVM:TViewModel
{
static VMBase()
{
if (!GC.Container.IsRegistered(typeof(TViewModel)))
GC.Container.RegisterType(typeof (TViewModel), typeof(TDesignVM));
}
}

public class MyView
{
public MyView(MyClass myClass)
{
Console.WriteLine("Bad: "+myClass.GetType().ToString());
Console.WriteLine("Good: "+GC.Container.Resolve<MyClass>().GetType());
}
}

输出是:

Bad: MyClass
Good: MyClassDesign

解析的类型是 MyClass。但它应该是 MyClassDesign。 (静态构造函数在 MyClass 在 MyView 类中解析之前运行。)

如何让 Unity 允许我在静态构造函数中设置我的映射?

注意:当我使用文件(而不是代码)更改此设置时,UnityContainer 一切正常。但我宁愿不为此依赖外部文件。 (我正在制作一个可重复使用的模板,我不想在其中有太多依赖项。)

最佳答案

为什么要将注册逻辑放在 View 模型中?这会将您的应用程序代码耦合到容器,这绝不是一个好主意。看看 Composition roots 的概念.

DI 容器的所有设置代码都应该放在那里。

关于c# - UnityContainer.RegisterType 在放入静态构造函数时不会被使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10923483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com