我可以在Orchard CMS中使用我的Ninject .NET项目吗?

Mat*_*ias 5 asp.net asp.net-mvc ninject autofac orchardcms

我正在使用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());
    }
}
Run Code Online (Sandbox Code Playgroud)

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

EFMembershipManager.cs构造函数

public EFMembershipManager(ServerRepository db,
                           ServerRepositoryMembershipProvider membershipProvider,
                           string testUsername,
                           string serverUsername)
{
...
}
Run Code Online (Sandbox Code Playgroud)

EFMembershipManager是一个来自外部项目的类,它使用Ninject进行DI和使用,ServerRepository并且ServerRepositoryMembershipProvider也使用Ninject注入.

而现在我被卡住了......

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

Pet*_*old 4

Autofac 支持注册源(更多有关注册源的信息请参见此处)。注册源是容器在尝试解析类型时将参考的服务。源可以通过构建类型的方法或指示源无法提供所请求类型的空列表来响应。

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

我对 Orchard 不太熟悉,但我猜测它使用配置文件来配置 Autofac。我的建议是您创建一个简单的 Autofac 模块来注册您的注册源实现,并配置 Orchard从 config 加载该模块