5

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

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

用户模块.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();
    }
}

用户服务.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 和使用ServerRepository,并且ServerRepositoryMembershipProvider也使用 Ninject 注入。

现在我被困住了......

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

4

1 回答 1

4

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

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

I'm not too familiar with Orchard but I'm guessing that it uses configuration files to configure Autofac. My suggestion is that you create a simple Autofac module that registers your registration source implementation, and that you configure Orchard to load the module from config.

于 2012-08-30T14:32:55.277 回答