我正在开发更大规模的MVC应用程序,并且一直在尝试将DI与Ninject一起使用。我有以下项目:
核心 - 类库(包含自定义成员资格提供程序) 域 - 类库(包含用于访问IUserRepository等数据的接口和EF) WebUI - MVC 3项目
我已将IUserRepository绑定到我的WebUI的App_Start容器中的Ninject启动中的UserRepository。
public static class NinjectWebCommon
{
private static readonly Bootstrapper bootstrapper = new Bootstrapper();
/// <summary>
/// Starts the application
/// </summary>
public static void Start()
{
DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
bootstrapper.Initialize(CreateKernel);
}
/// <summary>
/// Stops the application.
/// </summary>
public static void Stop()
{
bootstrapper.ShutDown();
}
/// <summary>
/// Creates the kernel that will manage your application.
/// </summary>
/// <returns>The created kernel.</returns>
private static IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
RegisterServices(kernel);
return kernel;
}
/// <summary>
/// Load your modules or register your services here!
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IUserRepository>().To<UserRepository>();
}
}
但是我想在我的客户成员资格提供程序中使用UserRepository和核心类库...
public class MyMembershipProvider : MembershipProvider
{
private IUserRepository userRepository;
public MyMembershipProvider (IUserRepository repository)
{
this.userRepository = repository;
}
public override string ApplicationName
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
// Rest of methods....
然而,由于我的Ninject启动在WebUI项目中并且可能对类库一无所知,因此失败了。有没有办法让它为这些类库注入依赖项呢?
或者我应该以不同的方式来编写这些及其依赖项?
答案 0 :(得分:0)
我不确定您是否应该使用构造函数参数具有MembershipProvider或roleProvider 因为web.config当你注册你的自定义提供者时,它需要调用一个非参数构造函数,或者你试图调用例如:
public MembershipCreateStatus CreateUser(string userName, string password, string email)
{
MembershipCreateStatus status;
var memberProvider = (MyMembershipProvider)Membership.Provider;
memberProvider.CreateUser(userName, password, email, null, null, true, null, out status);
return status;
}
它将尝试使用空构造函数构造一个新的MyMembershipProvider,而不是使用[inject]属性