gpt4 book ai didi

c# - 使用 Windsor 在特定程序集和命名空间中注册所有服务?

转载 作者:行者123 更新时间:2023-11-30 20:51:27 29 4
gpt4 key购买 nike

这可能有点微不足道,但我一定做错了什么。我有一个 MVC 项目,其中有两个项目由 IoC 使用 Windsor 控制:

  1. MVC 项目
  2. 有服务的项目

通常我会使用 XML 文件注册服务。但是,我想自动注册所有服务和接口(interface)。

我所有的服务都放在名为 LetterAmazer.Business.Services 的服务项目中,在命名空间 LetterAmazer.Business.Services.Services 下。服务派生的接口(interface)位于命名空间 LetterAmazer.Business.Services.Domain 中。

我已尝试通过以下方式在我的 Global.asax 中进行设置:

private void InitializeContainer()
{
var oldProvider = FilterProviders.Providers.Single(f => f is FilterAttributeFilterProvider);
FilterProviders.Providers.Remove(oldProvider);

Container.Register(Component.For<IWindsorContainer>().Instance(this.Container));
Container.Install(new BootstrapInstaller());

Container.Register(
Classes.FromAssemblyInDirectory(new AssemblyFilter("LetterAmazer.Business.Services"))
.InNamespace("LetterAmazer.Business.Services.Services"));
Container.Install(new WebWindsorInstaller());

var provider = new WindsorFilterAttributeFilterProvider(this.Container);
FilterProviders.Providers.Add(provider);

DependencyResolver.SetResolver(new WindsorDependencyResolver(ServiceFactory.Container));
}

public IWindsorContainer Container
{
get { return ServiceFactory.Container; }
}

但这提供了几个问题。首先,它在运行 Classes.FromAssemblyInDirectory 调用时没有找到任何服务。此外,这不会获得接口(interface)。

所以我基本上是在问如何以最佳实践方式解决这个问题?我有 30 多项服务,而且我都想要它们,因此通过约定而不是手动添加它们是有意义的。

编辑:

我得到的代码:

  var assembly = Assembly.LoadFrom(Server.MapPath("~/bin/LetterAmazer.Business.Services.dll")); ;
Container.Register(
Classes.FromAssembly(assembly)
.InNamespace("LetterAmazer.Business.Services.Services")
.WithServiceAllInterfaces());

最佳答案

我没用过Classes.FromAssemblyInDirectory()方法,但我通常使用 FromThisAssembly()或“FromAssemblyContaining()”方法来选择程序集。同时FromAssembly("AssemblyName")被使用。

如果没有所有服务的基本接口(interface),我会按照以下方式编写以下代码:

container.Register(
Classes.FromAssembly("LetterAmazer.Business.Services")
.InNamespace("LetterAmazer.Business.Services.Services")
.WithServiceAllInterfaces());

如果有通用接口(interface)IService<T>我会使用以下注册:

container.Register(
Classes.FromAssembly("LetterAmazer.Business.Services")
.BasedOn(typeof(IService<>))
.WithServiceAllInterfaces());

我想补充一点,如果在注册时未指定生活方式,您的所有服务都将注册为单例。

您可以在文章中找到详细信息Registering components by conventions 来自温莎城堡网站。

关于c# - 使用 Windsor 在特定程序集和命名空间中注册所有服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21687526/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com