5

Orchard CMS を使用して Web サイトを作成しており、依存性注入のために Ninject で記述された外部 .NET プロジェクトがあり、Orchard CMS 内のモジュールと一緒に使用したいと考えています。Orchard が依存性注入に Autofac を使用していることは知っていますが、以前に DI を使用したことがないため、これが問題を引き起こしています。

UserModule次のように、ソースを登録する Autofac モジュール を作成しました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)
{
...
}

EFMembershipManagerDIと用途にNinjectを使用し、Ninjectを使用しServerRepositoryServerRepositoryMembershipProvider注入される外部プロジェクトのクラスです。

そして今、私は立ち往生しています...

NinjectUserRegistrationSourceコンテナー (カーネル) をコンストラクターの引数として取り、サービスを見つけてIUserServicesから、解決を Ninject カーネルに仲介し、空の Enumerable を返して、Autofac が関連するものを解決しようとしないようにするIUserServicesか、これが間違ったアプローチであるかを確認する必要があります。 ?

4

1 に答える 1

4

Autofac は登録ソースをサポートしています(登録ソースの詳細はこちら)。登録ソースは、型を解決しようとするときにコンテナーが参照するサービスです。ソースは、タイプを構築する手段、またはソースが要求されたタイプを提供できないことを示す空のリストのいずれかで応答できます。

あなたの場合、Ninject コンテナーから要求された型を解決しようとする登録ソースを実装できます。

私は Orchard にあまり詳しくありませんが、構成ファイルを使用して Autofac を構成していると推測しています。私の提案は、登録ソースの実装を登録する単純な Autofac モジュールを作成し、 config からモジュールをロードするように Orchard を構成することです。

于 2012-08-30T14:32:55.277 に答える