gpt4 book ai didi

c# - .NET 中的依赖注入(inject)示例 c#

转载 作者:行者123 更新时间:2023-12-02 05:18:27 27 4
gpt4 key购买 nike

我需要有关 DI 的帮助,但我以前从未使用过 DI。所以这个概念对我来说是新的。我的问题是假设我需要将日志保存到数据库或平面文件,或者可能是 Windows 事件日志。基于几个参数,我想将日志数据保存到数据库或平面文件或事件日志

例如,如果国家代码是 GBR然后事件日志将保存到数据库中。如果国家代码是美国然后事件日志将保存到平面文件中。如果国家代码是美国然后事件日志将保存到 Windows 事件日志中。

我得到了一个类似的代码,它用 DI 模式实现了上述问题。这是代码

public interface ILog
{
void Log(string text);
}

然后在你的类中使用这个接口(interface)

public class SomeClass
{
[Dependency]
public ILog Log {get;set;}
}

在运行时注入(inject)那些依赖

public class SomeClassFactory
{
public SomeClass Create()
{
var result = new SomeClass();
DependencyInjector.Inject(result);
return result;
}
}

实例在 app.config 中配置:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name ="unity"
type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity>
<typeAliases>
<typeAlias alias="singleton"
type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager,Microsoft.Practices.Unity" />
</typeAliases>
<containers>
<container>
<types>
<type type="MyAssembly.ILog,MyAssembly"
mapTo="MyImplementations.SqlLog, MyImplementations">
<lifetime type="singleton"/>
</type>
</types>
</container>
</containers>
</unity>
</configuration>

但是上面这段代码的问题是一次只能做一件事。如果程序集实现是针对数据库的,那么它将把它保存到数据库中,或者如果程序集实现是针对平面文件的,那么它将把它保存到平面文件中。

但我的要求是一样的,只是有点不同,比如我想根据国家代码保存数据。所以我需要更改代码和配置文件,因此我可以根据国家代码将数据保存在任何地方。请帮我解决代码和概念问题。谢谢

最佳答案

DI 框架有用的原因是避免需要制作大量样板工厂实现,如下所示:

public class SomeFactory
{
public SomeClass GetSomeClass()
{
return new SomeClass(new SomeDep1(), new SomeDep2(new SomeInnerDep()));
}
}

如果您在工厂中没有简单的需求,请不要回避只写您需要的内容。在你的例子中:

public class ILogFactory
{
public ILog Create(CountryCode code)
{
if(code == CountryCode.GBR) return new EvenLogger();

if(code == CountryCode.UK) return new DatabaseLogger(_providerFactory());

///etc...
}
}

编辑:另请注意,我编写了一个 ILog 工厂而不是 SomeClassFactory。这样工厂的用户就可以耦合到一个接口(interface),而不是一个具体的实例。这在 DI 中是一个非常有用的实践,通常,因为它允许您替换所需的具体类型。

关于c# - .NET 中的依赖注入(inject)示例 c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14259839/

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