我正在使用 Orchard CMS 创建一个网站,并且我有一个用 Ninject 编写的用于依赖注入(inject)的外部 .NET 项目,我想将它与 Orchard CMS 中的一个模块一起使用。我知道 Orchard 使用 Autofac 进行依赖注入(inject),这给我带来了问题,因为我以前从未使用过 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 注入(inject)。现在我被困住了......
应该
UserRegistrationSource
将 Ninject 容器(内核)作为构造函数参数并尝试找到 IUserServices
服务,然后调解 Ninject 内核的解析并返回一个空的 Enumerable 以便 Autofac 不会尝试解析与 IUserServices
相关的任何内容还是这是错误的方法?
最佳答案
Autofac 支持 registration sources (以及更多关于注册来源 here 的信息)。注册源是容器在尝试解析类型时将咨询的服务。源可以通过构建类型的方法或指示源无法提供请求的类型的空列表来响应。
在您的情况下,可以实现一个注册源,它将尝试从您的 Ninject 容器中解析请求的类型。
我对 Orchard 不太熟悉,但我猜它使用配置文件来配置 Autofac。我的建议是你创建 a simple Autofac module注册您的注册源实现,并将 Orchard 配置为 load the module from config .
关于asp.net - 我可以在 Orchard CMS 中使用我的 Ninject .NET 项目吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12143341/