c# - 策略工厂模式的 autofac 配置(已经解决)

标签 c# dependency-injection autofac strategy-pattern

给定以下解析 IProcessor

实例的代码

如何让 autofac 为我的服务消费者解决和创建这些问题?
我需要autofac来使用这个函数,或者类似这个函数的东西来为相应的项目创建相关的策略。这些策略需要以正确解决其依赖关系的方式创建。

理想情况下,这需要在 COMPOSITION ROOT 中发生的应用程序。 下面的代码没有正确使用容器来构建实例。实际代码中的 StrategyAStrategyB 会有它们自己的依赖关系。当消费者被处置时,它们也需要被处置。

容器
我试过这个,但收到一条错误消息,指出解析操作已经发生。

var builder = new Autofac.ContainerBuilder();
builder.RegisterType<StrategyA>().As<IProcessor>().Keyed<IProcessor>(typeof(ItemA).Name).InstancePerDependency();
builder.RegisterType<StrategyB>().As<IProcessor>().Keyed<IProcessor>(typeof(ItemB).Name).InstancePerDependency();
builder.Register<Func<string, IProcessor>>(c => (s) => c.ResolveKeyed<IProcessor>(s));
builder.RegisterType<MyServiceConsumer>().As<IConsumer>();

var container = builder.Build();
var consumer = container.Resolve<IConsumer>().DoStuff(new ItemA()).Dump();

服务消费者。

public class MyServiceConsumer : IConsumer {
    Func<string, IProcessor> processor;
    public MyServiceConsumer(Func<string, IProcessor> processor) {
        //processor.Dump("px");
        this.processor = processor;
    }
    public string DoStuff(IItem item) {
        return processor(item.GetType().Name).ProcessItem(item);
    }
}

这是接口(interface)。

public interface IConsumer { string DoStuff(IItem item); }
public interface IProcessor { string ProcessItem(IItem item); }
public interface IItem { string Name { get; } }
public interface IItemStrategy<in T> : IProcessor where T : IItem { string ProcessItem(T item); }

这是具体类。

public class ItemA : IItem { public string Name { get { return "A"; } } public string UniqueA { get { return "+ UA"; } } }
public class ItemB : IItem { public string Name { get { return "B"; } } public string UniqueB { get { return "+ UB"; } } }

策略实现。 我希望我正确地应用了模式,我确实想要理想的强类型策略?

public class StrategyA : IItemStrategy<ItemA> { 
    string IProcessor.ProcessItem(IItem item) { Debug.Assert(item is ItemA); return this.ProcessItem((ItemA)item); }
    public string ProcessItem(ItemA item) { return "PA " + item.Name + item.UniqueA; } 
}
public class StrategyB : IItemStrategy<ItemB> { 
    string IProcessor.ProcessItem(IItem item) { Debug.Assert(item is ItemB); return this.ProcessItem((ItemB)item); }
    public string ProcessItem(ItemB item) { return "PB " + item.Name + item.UniqueB; } 
}

最佳答案

我想通了。
提示在这里 autofac registration issue in release v2.4.5.724

var builder = new Autofac.ContainerBuilder();
builder.RegisterType<StrategyA>().As<IProcessor>().Keyed<IProcessor>(typeof(ItemA).Name).InstancePerDependency();
builder.RegisterType<StrategyB>().As<IProcessor>().Keyed<IProcessor>(typeof(ItemB).Name).InstancePerDependency();
builder.Register<Func<string, IProcessor>>(c => {
    var ctx = c.Resolve<IComponentContext>();
    return (s) => ctx.ResolveKeyed<IProcessor>(s);
});
builder.RegisterType<MyServiceConsumer>().As<IConsumer>();

var container = builder.Build();

var consumer = container.Resolve<IConsumer>().DoStuff(new ItemB()).Dump();

关于c# - 策略工厂模式的 autofac 配置(已经解决),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18482985/

相关文章:

c# - 如何在C#中更改Windows窗体应用程序的主题

c# - WPF - 动态重新排列控件层次结构

c# - ConcurrentQueue.Count 在 .NET Core 中非常慢

asp.net-mvc-3 - 使用 Autofac 将属性注入(inject)到自定义 WebViewPage

c# - Web API2 NinjectWebCommon.cs 没有出现

python - python模拟模块是否通过依赖注入(inject)工作?

c# - Service Fabric 包含其他文件

c# - Entity Framework 6 on MVVM + PRISM 模式

c# - 使用 "constructor scope"注入(inject)依赖 - autofac

c# - 尝试将属性路由与 autofac 一起使用的异常