Tôi đang tạo một trang web bằng cách sử dụng Orchard CMS và tôi có một dự án .NET bên ngoài được viết với Ninject để tiêm phụ thuộc mà tôi muốn sử dụng cùng với một mô-đun trong Orchard CMS. Tôi biết rằng Orchard sử dụng Autofac để tiêm phụ thuộc và điều này gây ra cho tôi những vấn đề vì tôi chưa bao giờ làm việc với DI trước đây.Tôi có thể sử dụng dự án Ninject .NET của mình trong Orchard CMS không?
Tôi đã tạo ra một mô-đun Autofac, UserModule
, mà đăng ký các nguồn, UserRegistrationSource
, như thế này:
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 constructor
public EFMembershipManager(ServerRepository db,
ServerRepositoryMembershipProvider membershipProvider,
string testUsername,
string serverUsername)
{
...
}
EFMembershipManager
là một lớp học từ dự án bên ngoài trong đó sử dụng Ninject cho DI và sử dụng ServerRepository
và ServerRepositoryMembershipProvider
ai cũng được tiêm sử dụng Ninject.
Và bây giờ tôi đang mắc kẹt ...
nên UserRegistrationSource
mất container Ninject (kernel) như một đối số nhà xây dựng và cố gắng tìm ra dịch vụ IUserServices
và sau đó hòa giải giải quyết để kernel Ninject và trả về một sản phẩm nào Có thể đếm được để Autofac không cố gắng giải quyết bất kỳ điều gì liên quan đến IUserServices
hoặc đây có phải là cách tiếp cận sai không?
Bạn có thể giải thích lý do tại sao cần viết lại không? Dường như với tôi chỉ có những gì mã nhỏ đang đối phó với tiêm sẽ cần phải được sửa đổi. Bạn đề cập đến vấn đề. Họ đặc biệt là gì? –
@BertrandLeRoy Việc viết lại xuất phát từ thực tế là dự án bên ngoài có rất nhiều tiêm phụ thuộc và tham chiếu đến các dự án khác cũng sử dụng Ninject để tiêm phụ thuộc. Vì vậy, sẽ có rất nhiều sửa đổi để có được tất cả mọi thứ để làm việc. Vấn đề tôi phải đối mặt chỉ đơn giản là làm thế nào tôi có thể tham khảo các dự án bên ngoài trong mô-đun Orchard của tôi mà không cần phải chuyển đổi tất cả các tiêm Ninject để tiêm Autofac. Nếu điều đó thậm chí có thể. – Mattias
Tôi không nghĩ rằng có một cách khác hoặc nếu bạn sẽ có thể thực hiện công việc này. Có thể tốt hơn để giữ cho dự án bên ngoài đó bên ngoài. –