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
{
    
}