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)
{
...
}
EFMembershipManager
DIと用途にNinjectを使用し、Ninjectを使用しServerRepository
てServerRepositoryMembershipProvider
注入される外部プロジェクトのクラスです。
そして今、私は立ち往生しています...
NinjectUserRegistrationSource
コンテナー (カーネル) をコンストラクターの引数として取り、サービスを見つけてIUserServices
から、解決を Ninject カーネルに仲介し、空の Enumerable を返して、Autofac が関連するものを解決しようとしないようにするIUserServices
か、これが間違ったアプローチであるかを確認する必要があります。 ?