简体   繁体   English

如何在Autofac中自动解析命名类型?

[英]How to automatically resolve named type in Autofac?

In Unity, I can register a named type like this 在Unity中,我可以注册这样的命名类型

using Microsoft.Practices.Unity;
var container = new UnityContainer();
container.RegisterType<IOutputService, ConsoleOutputService>("Console");
container.RegisterType<IOutputService, MessageBoxOutputService>("MessageBox");
container.RegisterType<ICalculatorReplLoop, CalculatorReplLoop>();
ICalculatorReplLoop loop = container.Resolve<ICalculatorReplLoop>();

and auto resolve it using attribute like this 并使用这样的属性自动解析

public class CalculatorReplLoop : ICalculatorReplLoop
{
    public CalculatorReplLoop() {}

    [Dependency("MessageBox")]
    public IOutputService OutputService { get; set; }
}

I know how to register Named Service in Autofac 我知道如何在Autofac中注册命名服务

using Autofac;
using Autofac.Core;
var builder = new ContainerBuilder();
builder.RegisterType<ConsoleOutputService>().Named<IOutputService>("Console");
builder.RegisterType<MessageBoxOutputService>().Named<IOutputService>("MessageBox");
builder.RegisterType<CalculatorReplLoop>().As<ICalculatorReplLoop>().SingleInstance();
IContainer container = builder.Build();
ICalculatorReplLoop loop = container.Resolve<ICalculatorReplLoop>();

but how to resolve it inside CalculatorReplLoop class ? 但是如何在CalculatorReplLoop类中解决它?

Look at this Sample code and this is one of the ways of auto resolve the using autofac when you share a contract with two implementations. 查看此示例代码,这是与两个实现共享合同时自动解决使用autofac的方法之一。

using System;
using Autofac;
using Autofac.Features.Indexed;
namespace AutoFac
    {

        class Program
        {
            static void Main(string[] args)
            {
                var builder = new ContainerBuilder();
                builder.RegisterType<OnlineState>().Keyed<IDeviceState>("online");
                builder.RegisterType<OfflineState>().Keyed<IDeviceState>("offline");

                builder.RegisterType<Modem>().AsImplementedInterfaces();

                var container = builder.Build();

                var r = container.Resolve<IModem>();

                r.print();

            }
        }
    public interface IDeviceState
        {
            string Get();
        }
        public class OnlineState : IDeviceState
        {
            public string Get()
            {
                return "OnlineState";
            }
        }
        public class OfflineState : IDeviceState
        {
            public string Get()
            {
                return "OfflineState";
            }
        }
        public class Modem  : IModem
        {
             readonly IIndex<string, IDeviceState> _states;
             private readonly IDeviceState _deviceState;
             public Modem(IIndex<string, IDeviceState> states)
             {
                 _states = states;
                 _deviceState = _states["online"];
                //_deviceState = _states["offline"];
             }

             public void print()
             {
                 Console.WriteLine(_deviceState.Get());
             }
        }

        public interface IModem
        {
            void print();
        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM