是否可以覆盖类型注册

时间:2014-03-19 16:30:17

标签: asp.net autofac

我在模块中注册了一个类型:

moduleBuilder.RegisterType<Service>().As<Interface>().InstancePerLifetimeScope();

我想在不同的模块中覆盖,以便原始服务不在解决方案范围内使用。 这可能吗?

2 个答案:

答案 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();
    }
}
相关问题