【发布时间】:2012-08-27 13:50:01
【问题描述】:
我正在使用 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 并使用 ServerRepository 和 ServerRepositoryMembershipProvider,它们也使用 Ninject 注入。
现在我被卡住了……
应该UserRegistrationSource 将 Ninject 容器(内核)作为构造函数参数并尝试找到 IUserServices 服务,然后将解析调解到 Ninject 内核并返回一个空的 Enumerable,以便 Autofac 不会尝试解析与IUserServices 相关的任何内容或者这是错误的方法吗?
【问题讨论】:
-
你能解释一下为什么它需要重写吗?在我看来,只有处理注入的小代码需要修改。你提到问题。它们具体是什么?
-
@BertrandLeRoy 重写是因为外部项目有很多依赖注入和对其他项目的引用,这些项目也使用 Ninject 进行依赖注入。因此,为了让一切正常工作,将会进行大量修改。我面临的问题只是如何在我的 Orchard 模块中引用外部项目,而无需将所有 Ninject 注入转换为 Autofac 注入。如果有可能的话。
-
我认为没有其他方法或者您是否能够完成这项工作。将外部项目保留在外部可能会更好。
-
您可以控制 Ninject 容器实例吗?如果是这样,应该很容易将注册源插入 Autofac 容器,该容器将调解解析到 Ninject 容器。
-
@PeterLillevold 是的,我可以控制 Ninject 容器实例。在 Orchard 的 Autofac 容器中在哪里进行注册?在 Autofac 和 DI 方面,我完全是新手。
标签: asp.net asp.net-mvc ninject orchardcms autofac