gpt4 book ai didi

c# - Autofac - 如何在创建实例时获取类名

转载 作者:太空狗 更新时间:2023-10-29 23:06:44 25 4
gpt4 key购买 nike

我对 Autofac 有疑问:如何获取从容器请求实例的类的名称?

是否可以在创建对象时获取由 autofac 传递给构造函数的类“Autofac_Test”的名称?

我的代码:

using System;
using System.Diagnostics;
using System.Reflection;
using Autofac;
using Xunit;

public class BootStrap
{
public IContainer Configure()
{
var builder = new ContainerBuilder();
builder.Register(b => new MyLogger(MethodBase.GetCurrentMethod().ReflectedType)).As<ILog>();
return builder.Build();
}
}
public class Autofac_Test
{
private IContainer _containter;
public Autofac_Test()
{
_containter = new BootStrap().Configure();
}
[Fact]
public void Should_create_class_with_Name_BlaBla()
{
var logger = _containter.Resolve<ILog>();
Assert.True(logger.Name == "Autofac_Test");
}
}
public class MyLogger : ILog
{
public string Name { get; private set; }
public MyLogger(Type name)
{
Name = name.FullName;
}
public void Info(string message)
{
Debug.WriteLine(string.Format("{0} {1}", Name, message));
}
}

public interface ILog
{
void Info(string message);
string Name { get; }
}

最佳答案

对于您的具体情况,获取此信息将非常困难。但据我了解这个问题,MyLogger 需要知道它将被注入(inject)的类型名称,代码示例可能不相关。

在这种情况下,您可以使用模块和 Preparing 事件:

public class LoggingModule : Autofac.Module
{
protected override void AttachToComponentRegistration(
IComponentRegistry componentRegistry, IComponentRegistration registration)
{
registration.Preparing += (sender, e) =>
{
Type limitType = e.Component.Activator.LimitType;
e.Parameters = e.Parameters.Union(new[] {
new ResolvedParameter((pi, c) => pi.ParameterType == typeof(ILogger),
(pi, c) => c.Resolve<ILogger>(new NamedParameter("name", limitType.Name))),
});
};
}
}

然后你必须像这样注册你的模块:

ContainerBuilder builder = new ContainerBuilder();
builder.RegisterModule<LoggingModule>();
builder.RegisterType<MyLogger>().As<ILogger>();

现在,每次 ILogger 被注入(inject)到一个类型时,它都会有正确的名称。

class Foo
{
public Foo(ILogger logger)
{
this._loggerName = logger.Name;
}

private readonly String _loggerName;

public String LoggerName
{
get
{
return this._loggerName;
}
}
}

LoggerName 将为 Foo

你的测试现在看起来像这样:

[Fact]
public void Should_create_class_with_Name_BlaBla()
{
var foo = _containter.Resolve<Foo>();
Assert.AreEquals("foo", foo.LoggerName, "invalid loggerName");
}

关于c# - Autofac - 如何在创建实例时获取类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30350954/

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