3

我目前正在为我们公司测试 Autofac。

我们希望有以下规则:

  1. 如果一个接口只实现了一次,则使用 builder.RegisterAssemblyTypes 自动添加它(见下文)。

  2. 否则,我们需要确保手动编写将决定哪个实现是“默认”实现的规则。

我有以下代码:

var builder = new ContainerBuilder();
builder.RegisterAssemblyTypes(Assembly
    .Load("Lunch.Service")).As(t => t.GetInterfaces()[0]);
builder.RegisterType<ConsoleLoggerService>()
    .As<ILoggerService>().SingleInstance();
builder.RegisterModule(new DestinationModule());
builder.RegisterType<TransportationService>()
    .As<ITransportationService>().PropertiesAutowired();

现在,它正在工作,但它决定了第一个实现是哪个,并将自动创建它。如果我们不手动创建“规则”,我们希望将其设为手动过程并引发错误。这可能吗?

4

1 回答 1

1

你可以这样做:

cb.RegisterAssemblyTypes(assembly).Where(type =>
{
    var implementations = type.GetInterfaces();

    if (implementations.Length > 0)
    {
        var iface = implementations[0];

        var implementers =
            from t in assembly.GetTypes()
            where t.GetInterfaces().Contains(iface)
            select t;

        return implementers.Count() == 1;
    }

    return false;
})
.As(t => t.GetInterfaces()[0]);

这将注册只有一个实现者存在的所有实现,并忽略具有多个实现的接口,以便您可以手动注册它们。请注意,我并没有声称这以任何方式有效(例如,根据服务的数量,您可能希望查看缓存实现者)。

于 2012-05-08T14:32:07.387 回答