gpt4 book ai didi

c# - 将 Unity DI 与控制台应用程序一起使用

转载 作者:太空狗 更新时间:2023-10-30 00:10:17 25 4
gpt4 key购买 nike

我试图让 Unity 与我的控制台应用程序一起工作,但是..我尝试依赖注入(inject)的所有属性仍然设置为空。

这是我的代码:

程序.cs

namespace .Presentation.Console
{
class Program
{
static void Main(string[] args)
{
var mainThread = new MainThread();
}
}
}

主线程.cs

namespace xxxx.Presentation.Console
{
public class MainThread
{
public IUnitOfWork UnitOfWork { get; set; }

public IMapper Mapper { get; set; }

public MainThread()
{
Mapper.RegisterMappings();
}
}
}

应用程序配置

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
</startup>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<alias alias="IDataAccess" type="UnityFramework.IDataAccess, UnityFramework" />
<namespace name="UnityFramework" />
<assembly name="UnityFramework" />
<container>
<types>

<type type="IMapper" mapTo="xxxx.Core.Parse.ParseMapper" />

</types>
</container>
</unity>
</configuration>

App.config 设置为始终复制

在这种情况下 Mapper 返回为 null(我假设 UnitOfWork 也是如此)

我还需要做其他事情吗?添加一些东西到 app.config?我错过了什么吗?

提前致谢!

Br,指数

最佳答案

Unity 为通过Resolve 获取的组件提供依赖项或在解决子依赖性时。必须从容器中手动获取“根”组件。

使用 new Program 不会自动提供依赖项,因为它绕过了 Unity 容器。

static class ProgramEntry
{
static void Main(string[] args)
{
var unity = CreateUnityContainerAndRegisterComponents();
// Explicitly Resolve the "root" component or components
var program = unity.Resolve<Program>();
program.Run();
}
}

public class Program
{
readonly Ix _x;

// These dependencies will be automatically resolved
// (and in this case supplied to the constructor)
public Program(IMapper mapper, Ix x)
{
// Use dependencies
mapper.RegisterMappings();

// Assign any relevant properties, etc.
_x = x;
}

// Do actual work here
public void Run() {
_x.DoStuff();
}
}

对于大多数任务,我更喜欢基于代码的注册。

  • 我建议不要使用属性,尽管它们“会起作用”如果遵循Resolve上面的图案。 必须手动解析“根”对象。

    属性的问题在于它们添加了 Unity 的依赖——“反转”就这么多了!

    构造函数注入(inject)(如图所示)是自动/默认。参见 Setter / property injection in Unity without attributes如果首选属性注入(inject)。

  • 我可能会解析工厂(或 Func<UoW>)以创建 UoW,并在适用时将其提供给调用堆栈上下文(即,将其传递给方法)。应用程序在单次运行期间可能有许多不同的 UoW。在这种情况下,您可能还对创建范围感兴趣。

  • 我也可能会在解析时使用工厂创建预配置的 IMapper 对象,而不是事后使用 RegisterMappings。

关于c# - 将 Unity DI 与控制台应用程序一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29103508/

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