autofacc:注册类的层次结构



我正在努力注册Autofac类和接口的层次结构。我有一个接口IMyService定义如下:

public interface IMyService
{
void DoMyService();
}

我有两个抽象类来实现这个接口,分别是MyServiceA和MyServiceB:

public abstract class MyServiceA : IMyService
{
public abstract DoMyService();
}
public abstract class MyServiceB : IMyService
{
public abstract DoMyService();
}

此外,对于前面提到的两个服务:MyServiceA1, MyServiceA2, MyServiceB1和MyServiceB2,我都有一个二级层次结构:

public class MyServiceA1 : MyServiceA
{
public MyServiceA1() : base() {}
public void DoMyService()
{
// Implementation goes here
}
}
public class MyServiceA2 : MyServiceA
{
public MyServiceA2() : base() {}
public void DoMyService()
{
// Implementation goes here
}
}
public class MyServiceB1 : MyServiceB
{
public MyServiceB1() : base() {}
public void DoMyService()
{
// Implementation goes here
}
}
public class MyServiceB2 : MyServiceB
{
public MyServiceB2() : base() {}
public void DoMyService()
{
// Implementation goes here
}
}

输入中有两个枚举FirstEnum和SecondEnum,用于选择要实例化的四个具体类型中的哪一个:

public enum FirstEnum
{
SvcA, 
SvcB 
}
public enum SecondEnum
{
Svc1, 
Svc2
}

我想注册IMyService,通过提供两个枚举,它将自动实例化好的具体类型。例如,如果我想解析一个IMyService,并且我提供了firstum。SvcB和次级十二指肠。在Svc2中,它应该实例化具体类型MyServiceB2类。此外,这个层次结构可能会通过添加一些其他具体类型等来更新,所以我需要一种通用的方法来完成它

有没有人有线索可以帮助我?

感谢

如果您希望根据一组参数动态地创建特定的服务,那么这是抽象工厂的一个很好的用例:

public interface IMyServiceFactory
{
IMyService Create(FirstEnum e1, SecondEnum e2);
}
public class MyServiceFactory : IMyServiceFactory
{
private readonly ILifetimeScope scope;
public MyServiceFactory(ILifetimeScope scope)
{
if (scope == null)
throw new ArgumentNullException("scope");
this.scope = scope;
}
public IMyService Create(FirstEnum e1, SecondEnum e2)
{
if (e1 == FirstEnum.SvcA)
{
if (e2 == SecondEnum.Svc1)
{
return scope.Resolve<MyServiceA1>();
}
else //svc2
{
return scope.Resolve<MyServiceA2>();
}
}
else //B
{
if (e2 == SecondEnum.Svc1)
{
return scope.Resolve<MyServiceB1>();
}
else //svc2
{
return scope.Resolve<MyServiceB2>();
}
}
}
}

现在你的消费者需要注入工厂而不是服务:

public class MyServiceConsumer
{
private readonly IMyServiceFactory factory;
public MyServiceConsumer(IMyServiceFactory factory)
{
this.factory = factory;
}
public void Do()
{
//var service = this.factory.Create
}
}

注册:

Autofac.ContainerBuilder builder = new Autofac.ContainerBuilder();
builder.RegisterType<MyServiceA1>().AsSelf().AsImplementedInterfaces();
builder.RegisterType<MyServiceA2>().AsSelf().AsImplementedInterfaces();
builder.RegisterType<MyServiceB1>().AsSelf().AsImplementedInterfaces();
builder.RegisterType<MyServiceB2>().AsSelf().AsImplementedInterfaces();
builder.RegisterType<MyServiceFactory>().As<IMyServiceFactory>();
builder.RegisterType<MyServiceConsumer>();
//and quick test resolve
var container = builder.Build();
var test = container.Resolve<MyServiceConsumer>();

最新更新