我正在使用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不会&# 39;尝试解决与IUserServices
相关的任何问题,或者这是错误的方法吗?
答案 0 :(得分:4)
Autofac支持registration sources(以及有关注册来源here的更多内容)。注册源是容器在尝试解析类型时将参考的服务。源可以通过构建类型的方式响应,也可以响应指示源无法提供所请求类型的空列表。
在您的情况下,可以实现注册源,尝试从Ninject容器中解析所请求的类型。
我对Orchard不太熟悉,但我猜它使用配置文件来配置Autofac。我的建议是,您创建a simple Autofac module来注册您的注册源实现,并将Orchard配置为load the module from config。