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

时间:2012-08-27 13:50:01

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

我正在使用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不会&# 39;尝试解决与IUserServices相关的任何问题,或者这是错误的方法吗?

1 个答案:

答案 0 :(得分:4)

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

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

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