代码之家  ›  专栏  ›  技术社区  ›  alphadogg

正在注入存储库成员资格提供程序。初始化()? 坏主意?

  •  1
  • alphadogg  · 技术社区  · 16 年前

    我正在建立一个asp.net使用StructureMap的MVC2 web应用程序。我已经创建了一个自定义成员资格提供程序。我在启动时通过调用以下命令将其正确初始化:

    x.For<MembershipProvider>().Use(Membership.Provider);
    x.For<IMembershipProvider>().Use<CPOPMembershipProvider>();
    

    在Initialize()中,我考虑实例化一个存储库,用于访问数据库中的用户数据。

    因此,我在自定义成员资格提供程序中放入了一个私有属性:

    private IUserRepository userRepository;
    

    在Initialize()中,我调用:

    IUserRepository userRepository = ObjectFactory.GetInstance<IUserRepository>();
    

    第二,当我实现它时,似乎无法访问在中正确设置的任何StructureMap配置global.asax. 当我打电话的时候Debug.WriteLine(ObjectFactory.WhatDoIHave())就在上面的GetInstance()行之前,没有任何配置数据(我确实从放置在global.asax)我得到一个“没有为PluginFamily定义默认实例”CPOP.Domain.Contracts.Repositories.IUserRepository“调用GetInstance()时出错。为什么?好像我在MembershipProvider里面有一个完全不同的容器。

    3 回复  |  直到 16 年前
        1
  •  3
  •   alphadogg    16 年前

    最后使用了 setter injection

    CPOPMembershipProvider member =
         (CPOPMembershipProvider) Membership.Providers["CPOPMembershipProvider"];
    ObjectFactory.Configure(x =>
    {
        ...
        x.For<MembershipProvider>().Use(Membership.Provider);
        x.For<IMembershipProvider>().TheDefault.Is.Object(member);
        ...
        x.For<IPatientRepository>().Use<PatientRepository>();
        x.For<IUserRepository>().Use<UserRepository>();
        x.SetAllProperties(y => { y.OfType<IUserRepository>(); });
        ...
    }); 
    

    然后对目标实例调用building()。在调用了所有的注册表并且StructureMap包含了所有的配置数据之后,我在Application\ u Start()中执行此操作。

    ObjectFactory.BuildUp(Membership.Providers["CPOPMembershipProvider"]);
    

    完成。

        2
  •  0
  •   Peter J    14 年前

    非常感谢你回答我的问题…这正是我想要的。

    UserMembershipProvider provider = 
     (UserMembershipProvider)Membership.Providers["UserMembershipProvider"];
    
    ObjectFactory.Configure(x =>
    {
        x.For<ISessionFactory>()
            .Singleton()
            .Use(() => NHibernateInitializer.Initialize().BuildSessionFactory());
        x.For<IEntityDuplicateChecker>().Use<EntityDuplicateChecker>();
        x.For(typeof(IRepository<>)).Use(typeof(Repository<>));
        x.For(typeof(IRepositoryWithTypedId<,>)).Use(typeof(RepositoryWithTypedId<,>));
        x.SetAllProperties(y =>
        {
            y.WithAnyTypeFromNamespaceContainingType<IEntityDuplicateChecker>();
        });
    });
    
    ObjectFactory.BuildUp(provider);
    DependencyResolver.SetResolver(
      new StructureMapDependencyResolver(ObjectFactory.Container));
    

    通过这种方式,一切都从控制器工厂的角度来工作,并且成员资格提供者是在事实之后“构建”的(因为它已经在应用程序启动之前构建了,这要归功于.NET)。上面的代码是从应用程序启动时调用的。

        3
  •  0
  •   Toni Parviainen    14 年前

    我只需要实现ValidateUser,因为我们不使用任何其他方法,我是这样做的:

    public bool ValidateUser(string userName, string password)
    {
        var session = DependencyResolver.Curret.GetService<ISession>();
    
        using (session)
        {
            using (var tx = session.BeginTransaction())
            {
                // load the user from db and validate the password etc.
                tx.Commit();
            }
        }
    }
    

    当然,您需要配置DependencyResolver、StructureMap等,但关键是ISession没有保存在私有字段/属性中。