【问题标题】:Can I use my Ninject .NET project within Orchard CMS?我可以在 Orchard CMS 中使用我的 Ninject .NET 项目吗?
【发布时间】:2012-08-27 13:50:01
【问题描述】:

我正在使用 Orchard CMS 创建一个网站,并且我有一个用 Ninject 编写的用于依赖注入的外部 .NET 项目,我想将它与 Orchard CMS 中的一个模块一起使用。我知道 Orchard 使用 Autofac 进行依赖注入,这给我带来了问题,因为我以前从未使用过 DI。

我创建了一个 Autofac 模块 UserModule,它注册了一个源 UserRegistrationSource,如下所示:

UserModule.cs

public class UserModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterSource(new UserRegistrationSource());
    }
}

UserRegistrationSource.cs

public class UserRegistrationSource : IRegistrationSource
{
    public bool IsAdapterForIndividualComponents
    {
        get { return false; }
    }

    public IEnumerable<IComponentRegistration> RegistrationsFor(Service service, Func<Service, IEnumerable<IComponentRegistration>> registrationAccessor)
    {
        var serviceWithType = service as IServiceWithType;
        if (serviceWithType == null)
            yield break;

        var serviceType = serviceWithType.ServiceType;
        if (!serviceType.IsInterface || !typeof(IUserServices).IsAssignableFrom(serviceType) || serviceType != typeof(IUserServices))
            yield break;

        var registrationBuilder = // something...

        yield return registrationBuilder.CreateRegistration();
    }
}

UserServices.cs

public interface IUserServices : IDependency
{
    void Add(string email, string password);
}

public class UserServices : IUserServices
{
    private readonly EFMembershipManager _manager;

    public UserServices(EFMembershipManager manager)
    {
        _manager = manager;
    }

    public void Add(string email, string password)
    {
        _manager.createUser(email, password);
    }
}

EFMembershipManager.cs构造函数

public EFMembershipManager(ServerRepository db,
                           ServerRepositoryMembershipProvider membershipProvider,
                           string testUsername,
                           string serverUsername)
{
...
}

EFMembershipManager 是来自外部项目的一个类,它使用 Ninject 进行 DI 并使用 ServerRepositoryServerRepositoryMembershipProvider,它们也使用 Ninject 注入。

现在我被卡住了……

应该UserRegistrationSource 将 Ninject 容器(内核)作为构造函数参数并尝试找到 IUserServices 服务,然后将解析调解到 Ninject 内核并返回一个空的 Enumerable,以便 Autofac 不会尝试解析与IUserServices 相关的任何内容或者这是错误的方法吗?

【问题讨论】:

  • 你能解释一下为什么它需要重写吗?在我看来,只有处理注入的小代码需要修改。你提到问题。它们具体是什么?
  • @BertrandLeRoy 重写是因为外部项目有很多依赖注入和对其他项目的引用,这些项目也使用 Ninject 进行依赖注入。因此,为了让一切正常工作,将会进行大量修改。我面临的问题只是如何在我的 Orchard 模块中引用外部项目,而无需将所有 Ninject 注入转换为 Autofac 注入。如果有可能的话。
  • 我认为没有其他方法或者您是否能够完成这项工作。将外部项目保留在外部可能会更好。
  • 您可以控制 Ninject 容器实例吗?如果是这样,应该很容易将注册源插入 Autofac 容器,该容器将调解解析到 Ninject 容器。
  • @PeterLillevold 是的,我可以控制 Ninject 容器实例。在 Orchard 的 Autofac 容器中在哪里进行注册?在 Autofac 和 DI 方面,我完全是新手。

标签: asp.net asp.net-mvc ninject orchardcms autofac


【解决方案1】:

Autofac 支持registration sources(以及更多关于注册源here)。注册源是容器在尝试解析类型时将咨询的服务。源可以通过构建类型的方法或指示源无法提供请求的类型的空列表来响应。

在您的情况下,可以实现一个注册源,它将尝试从您的 Ninject 容器中解析请求的类型。

我对 Orchard 不太熟悉,但我猜它使用配置文件来配置 Autofac。我的建议是您创建a simple Autofac module 来注册您的注册源实现,并将Orchard 配置为load the module from config

【讨论】:

  • 好的,很好的答案。一些后续行动.. 注册源是否应该识别连接到外部项目 IUserServices 的服务,并指示 Ninject 容器(内核)解析它并返回一个空的可枚举,告诉 Autofac 不要解析请求的类型或这是错误的方法吗?
  • 我的想法是,由于它将是 Autofac 执行服务的初始请求,因此将“询问”源是否支持IUserServices(以及与此相关的所有其他服务)。然后它应该尝试从 Ninject 解析该服务。如果 Ninject 包含服务,您可以从源返回实例。如果不是,则源返回空。
猜你喜欢
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 2022-12-21
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 2020-03-04
相关资源
最近更新 更多