Введение использования метода фабрики StructureMap

Я использую обертку для поставщика Членства ASP.NET так, чтобы я мог больше слабо связать использование библиотеки. Я желаю использовать StructureMap для обеспечения истинного МОК, но я испытываю затруднения настроить его с объектом фабрики Пользователя к профилю, который я использую для помещения, инстанцируют профиля в контексте пользователя. Вот соответствующие детали, сначала интерфейс и обертка из библиотеки:

// From ASP.Net MVC Membership Starter Kit
public interface IProfileService
{
    object this[string propertyName] { get; set; }
    void SetPropertyValue(string propertyName, object propertyValue);
    object GetPropertyValue(string propertyName);
    void Save();
}

public class AspNetProfileBaseWrapper : IProfileService
{
    public AspNetProfileBaseWrapper(string email) {}

    // ...
}

Затем, репозиторий для взаимодействия с особым свойством в данных профиля:

class UserDataRepository : IUserDataRepository
{
    Func _profileServiceFactory;

    // takes the factory as a ctor param 
            // to configure it to the context of the given user
    public UserDataRepository(
              Func profileServiceFactory)
    {
        _profileServiceFactory = profileServiceFactory;
    }

    public object GetUserData(MembershipUser user)
    {
        // profile is used in context of a user like so:
        var profile = _profileServiceFactory(user);
        return profile.GetPropertyValue("UserData");
    }
}

Вот моя первая попытка обеспечения конфигурации реестра StructureMap, но это, очевидно, не работает:

public class ProfileRegistry : Registry
{
    public ProfileRegistry()
    {
        // doesn't work, still wants MembershipUser and a default ctor for AspNetProfileBaseWrapper
        For().Use();
    }
}

Теоретически, как я хотел бы зарегистрироваться, это посмотрит что-то как:

// syntax failure :)
For>()
  .Use new AspNetProfileBaseWrapper(u.Email)>();

... где я могу определить объект фабрики в конфигурации. Это - очевидно, не допустимый синтаксис. Существует ли простой способ выполнить это? Я должен использовать некоторый другой шаблон, чтобы позволить создавать мой UserDataRepository в контексте пользователя?Спасибо!

5
задан Joel 2 September 2013 в 10:11
поделиться

1 ответ

Если бы я посмотрел на перегрузки для использования, я бы нашел

Use(Func<IContext> func);

... который я могу использовать как:

For<IUserService>().Use(s =>
   new AspNetMembershipProviderWrapper(Membership.Provider));
15
ответ дан 13 December 2019 в 00:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: