Можно ли использовать контейнер IOC для создания пользовательского MembershipProvider? - PullRequest
1 голос
/ 23 января 2011

Я использую Autofac с ASP.NET MVC, поэтому все мои контроллеры имеют свои разрешенные зависимости.Но у меня есть пользовательский поставщик членства с двумя зависимостями.Я подозреваю, что код для создания поставщика членства находится глубоко в ASP.NET, в нескольких милях от Autofac.

Есть ли способ получить Autofac для разрешения моего пользовательского поставщика членства?

Я полагаючто вызывает что-то вроде .Resolve

Вот поставщик членства и его конструктор:

public class MongoDBMembershipProvider : MembershipProvider
{
    private IEmailService m_oEmailService;
    private IUserRepository m_oUsers;

    public MongoDBMembershipProvider() {
    }

    public MongoDBMembershipProvider( IEmailService oEmailservice, IUserRepository oUserRepository) {
        m_oEmailService = oEmailservice;
        m_oUsers = oUserRepository;
    }

    public override void Initialize( string name, NameValueCollection config) {
        //TODO: Let Autofac do this work... how?
        m_oEmailService = new EmailService();
        m_oUsers = new Users();
    }

    public override bool ValidateUser( string sUsername, string sPassword) {
        return m_oUsers.ValidateAttemptedLogon( sUsername, sPassword);
    }

    public override string GetUserNameByEmail( string sEmailAddress) {
        return m_oUsers.GetUsernameByEmail( sEmailAddress);
    }
}

Ответы [ 4 ]

3 голосов
/ 24 января 2011

Я написал в блоге о том, как применить IoC к провайдерам с Windsor .Сама концепция переносима на любой контейнер IoC, код довольно тривиален и позволяет использовать все возможности контейнера.

2 голосов
/ 23 января 2011

Несмотря на то, что провайдеры asp.net являются статичными, вы все равно можете заключить их в интерфейс. Тот, который я использовал, находится здесь:

http://gpsnerd.codeplex.com/SourceControl/changeset/view/03279dbfcef5#Infrastructure%2fMembership%2fIMembershipService.cs

Затем вы создадите реализацию этого интерфейса, которая использует членство asp.net. Затем вы можете позволить вашему ioc связать этот интерфейс с реализацией. Извлекая этот интерфейс, теперь вы можете проверить свой код, используя фальшивку.

боб

1 голос
/ 24 января 2011

вот мое предположение ...

Прежде всего удалите метод инициализации, который вам не нужен.

var builder = new ContainerBuilder();

builder.Register<EmailService>().As<IEmailService>();
builder.Register<Users>().As<IUserRepository>();
builder.Register<MongoDBMembershipProvider>().As<MembershipProvider>();

//something like this
MembershipProvider provider;
using (var container = builder.Build())
{
    provider = container.Resolve<MembershipProvider>();
}

все остальные здесь рассказали вам несколько идей о том, как запустить его во время выполнения, я думаю ...

0 голосов
/ 23 января 2011

Я думаю, что вы правы в том, что поставщик членства создан глубоко в ASP.NET. Я думаю, что было бы проще просто удалить интерфейсы из вашего конструктора и вызвать Resolve (или любой другой подходящий метод Autofac) для разрешения ваших зависимостей.

...