gpt4 book ai didi

c# - Unity IOC 使用InjectionConstructor 简化类型注册

转载 作者:太空宇宙 更新时间:2023-11-03 12:10:32 24 4
gpt4 key购买 nike

我想使用注入(inject)构造函数简化类型注册。 IOC 通常应该自行解析类型。有些类型不能自动解析,因为它们的构造函数需要一些命名参数。他们需要自定义注册。

例如:

public DatabaseLayer(string connectionString, 
string userName,
ILogger loger,
TypeMapper mapper,
...some other dependencies)

类型注册:

container.RegisterType<DatabaseLayer>(
new InjectionConstructor(
new ResolvedParameter<string>("connectionString"),
new ResolvedParameter<string>("userName"),
new ResolvedParameter<ILoger>("file")
typeof(TypeMapper),
typeof(..),
...));

如您所见,如果您在注册中需要任何命名解析,则需要记下数十个未命名参数或应用程序在运行时崩溃。更糟糕的是,每次更改构造函数参数时都需要更正注册。在 Programm 在运行时崩溃之前,您不会注意到任何事情。

所以我正在寻找扩展或配置 Unity 的方法,它允许我跳过默认(无名)参数注册以减少可能的错误并使 Bootstrap 尽可能小。

编辑很好地找到了我正在寻找的东西。 https://outlawtrail.wordpress.com/2012/08/02/fun-with-constructor-arguments-part-1-pick-choose/

智能构造函数似乎是解决方案

最佳答案

一种选择是使用 InjectionFactory 而不是 InjectionConstructor

假设这个模型:

public class DataBaseLayer
{
private readonly string _connectionString;
private readonly string _userName;
private readonly ILogger _logger;
private readonly ITypeMapper _mapper;

public DataBaseLayer(
string connectionString,
string userName,
ILogger logger,
ITypeMapper mapper)
{
_connectionString = connectionString;
_userName = userName;
_logger = logger;
_mapper = mapper;
}
}

public interface ITypeMapper
{
}

public class TypeMapper : ITypeMapper
{
}

public interface ILogger
{

}

public class Logger : ILogger
{

}

假设 UsernameConnectionString 存储在配置文件中(您没有指定这些参数的来源),我将创建一个 Bootstrapper 类如下所示:

public static class Bootstrapper
{
// assuming Username is a configuration setting stored in the config file
private static string Username => ConfigurationManager.AppSettings["username"];

// assuming ConnectionString is a connection string stored in the config file
private static string ConnectionString => ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString;

public static IUnityContainer Setup()
{
IUnityContainer container = new UnityContainer();
container.RegisterType<ILogger, Logger>();
container.RegisterType<ITypeMapper, TypeMapper>();
container.RegisterType<DataBaseLayer>(new InjectionFactory(CreateDataBaseLayer));

return container;
}

private static DataBaseLayer CreateDataBaseLayer(IUnityContainer container)
{
ILogger logger = container.Resolve<ILogger>();
ITypeMapper mapper = container.Resolve<ITypeMapper>();

return new DataBaseLayer(ConnectionString, Username, logger, mapper);
}
}

使用代码:

IUnityContainer container = Bootstrapper.Setup();
DataBaseLayer dbLayer = container.Resolve<DataBaseLayer>();

关于c# - Unity IOC 使用InjectionConstructor 简化类型注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52532968/

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