我在模块中注册了一个类型:
moduleBuilder.RegisterType<Service>().As<Interface>().InstancePerLifetimeScope();
我想在不同的模块中覆盖,以便原始服务不在解决方案范围内使用。 这可能吗?
答案 0 :(得分:1)
&#34;如果多个组件公开同一服务,Autofac将使用最后注册的组件作为该服务的默认提供商。&#34; [1]
因此,如果您在默认服务之后注册您的AnotherService,它将覆盖它。
// In Module1
moduleBuilder.RegisterType<Service>().As<Interface>().InstancePerLifetimeScope();
// In Module2
// AnotherService overrides Service
moduleBuilder.RegisterType<AnotherService>().As<Interface>().InstancePerLifetimeScope();
一个微妙的时刻:如果您无法控制或不想控制模块的注册顺序,那么您可以在默认服务注册中使用PreserveExistingDefaults()
修饰符,这样可以避免覆盖默认实现
// In Module1
moduleBuilder.RegisterType<Service>()
.As<Interface>()
.InstancePerLifetimeScope()
.PreserveExistingDefaults();
// In Module2
// AnotherService overrides Service
moduleBuilder.RegisterType<AnotherService>().As<Interface>().InstancePerLifetimeScope();
然后注册顺序无关紧要。
答案 1 :(得分:0)
您可以使用Autofac&#39; identification of services by name。例如,
builder.RegisterType<MorningService>()
.As<IGreetingService>()
.Named<IGreetingService>("morning")
.InstancePerHttpRequest();
builder.RegisterType<EveningService>()
.As<IGreetingService>()
.Named<IGreetingService>("evening")
.InstancePerHttpRequest();
builder.RegisterType<MorningController>()
.WithParameter(ResolvedParameter.ForNamed<IGreetingService>("morning"))
.InstancePerHttpRequest();
builder.RegisterType<EveningController>()
.WithParameter(ResolvedParameter.ForNamed<IGreetingService>("evening"))
.InstancePerHttpRequest();
// ***** You can even pass it to other service *****
builder.RegisterType<SomeService>().As<ISomeService>()
.WithParameter(ResolvedParameter.ForNamed<IGreetingService>("evening"))
.InstancePerHttpRequest();
public interface IGreetingService
{
string GetMessage();
}
public class MorningService : IGreetingService
{
public string GetMessage()
{
return "Have a good morning!";
}
}
public class EveningService : IGreetingService
{
public string GetMessage()
{
return "Have a good evening!";
}
}
public class EveningController : Controller
{
private readonly IGreetingService _service;
public EveningController(IGreetingService service)
{
_service = service;
}
//
// GET: /Evening/
public ActionResult Index()
{
ViewBag.Message = _service.GetMessage();
return View();
}
}