【问题标题】:Ninject DI with Class Library ProjectNinject DI 与类库项目
【发布时间】:2012-05-22 11:36:14
【问题描述】:

我正在开发一个更大规模的 MVC 应用程序,并且一直在尝试将 DI 与 Ninject 一起使用。我有以下项目:

Core - 类库(包含自定义成员资格提供程序) 域 - 类库(包含访问 IUserRepository 等数据的接口和 EF) WebUI - MVC 3 项目

我已在我的 WebUI 的 App_Start 容器内的 Ninject 启动中将 IUserRepository 绑定到 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 项目中,并且可能对类库一无所知。有没有办法让它也为这些类库注入依赖项?

或者我应该寻找一种不同的方式来对这些及其依赖项进行编码?

【问题讨论】:

标签: class dependency-injection ninject


【解决方案1】:

我不确定您是否应该使用带有构造函数参数的 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] 属性

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2011-01-26
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多