C# 在MVC 5中注入的类中注入通用服务
我有一个C# 在MVC 5中注入的类中注入通用服务,c#,asp.net-mvc,dependency-injection,autofac,C#,Asp.net Mvc,Dependency Injection,Autofac,我有一个ILogger接口和一个ILogger,它实际上是从前者实现和继承的。我已经在Autofac中注册了ILogger界面,它工作正常,但我必须要求提供ILogger。是否有可能使其在以下情况下: class MyService { public MyService(ILogger logger)... } logger实际上是ILogger所以先注册:从 builder.RegisterGeneric(typeof(nhibernaterepositional)) .As(类型(
ILogger
接口和一个ILogger
,它实际上是从前者实现和继承的。我已经在Autofac
中注册了ILogger
界面,它工作正常,但我必须要求提供ILogger
。是否有可能使其在以下情况下:
class MyService
{
public MyService(ILogger logger)...
}
logger
实际上是ILogger
所以先注册:从
builder.RegisterGeneric(typeof(nhibernaterepositional))
.As(类型(假定))
.InstancePerLifetimeScope();
所以你的代码
builder.RegisterGeneric(typeof(LoggerService<>))
.As(typeof(ILogger<>))
.InstancePerLifetimeScope();
builder.RegisterGeneric(typeof(LoggerService))
.As(类型(ILogger))
.InstancePerLifetimeScope();
这是我的工作示例:
using System;
using Autofac;
public class Program
{
public static void Main()
{
Console.WriteLine("Hello World");
var builder = new ContainerBuilder();
builder.RegisterGeneric(typeof(LoggerService<>))
.As(typeof(ILogger<>))
.InstancePerLifetimeScope();
var container = builder.Build();
var obj = container.Resolve<ILogger<MyService>>();
var obj2 = container.Resolve<ILogger<OtherService>>();
Console.WriteLine(obj.Log());
Console.WriteLine(obj2.Log());
}
}
public interface ILogger<T>
{
string Log();
}
public class LoggerService<T> : ILogger<T>
{
public string Log()
{
return typeof(T).Name;
}
}
public class MyService
{
}
public class OtherService
{
}
使用系统;
使用Autofac;
公共课程
{
公共静态void Main()
{
Console.WriteLine(“你好世界”);
var builder=new ContainerBuilder();
建造商注册通用(类型(日志服务))
.As(类型(ILogger))
.InstancePerLifetimeScope();
var container=builder.Build();
var obj=container.Resolve();
var obj2=container.Resolve();
Console.WriteLine(obj.Log());
Console.WriteLine(obj2.Log());
}
}
公共接口ILogger
{
字符串Log();
}
公共类日志服务:ILogger
{
公共字符串日志()
{
返回typeof(T).Name;
}
}
公共类MyService
{
}
公共服务
{
}
产出:
你好,世界
我的服务
其他服务
您需要
公共MyService(ILogger记录器)
。但这看起来像是你有一个奇怪的日志类。你能不能也为ILogger
注册它?我怀疑Autofac是否会自动使用您的ILogger
注册,仅仅因为它扩展了该接口。builder.RegisterGeneric(typeof(SomeInstance1)).As(typeof(IGenericInterface))
我已经在工作了,我想要的是能够做container.Resolve()
并获取适当的ILogger
,其中T
是调用Resolve
的类。如果调用Resolve,则不是依赖项注入。。。。。在您的构造函数中,您只需执行publicmyservice(ILogger-myServiceLogger)
,但您将一个贯穿各领域的关注点与一个服务捆绑在一起,这又一次显得很奇怪。这似乎有点奇怪…如果你看到我的问题,我想做的是publicmyservice(ILogger-logger)
,让logger
实际上是ILogger
。
using System;
using Autofac;
public class Program
{
public static void Main()
{
Console.WriteLine("Hello World");
var builder = new ContainerBuilder();
builder.RegisterGeneric(typeof(LoggerService<>))
.As(typeof(ILogger<>))
.InstancePerLifetimeScope();
var container = builder.Build();
var obj = container.Resolve<ILogger<MyService>>();
var obj2 = container.Resolve<ILogger<OtherService>>();
Console.WriteLine(obj.Log());
Console.WriteLine(obj2.Log());
}
}
public interface ILogger<T>
{
string Log();
}
public class LoggerService<T> : ILogger<T>
{
public string Log()
{
return typeof(T).Name;
}
}
public class MyService
{
}
public class OtherService
{
}