Я использую обертку для поставщика Членства 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 в контексте пользователя?Спасибо!
Если бы я посмотрел на перегрузки для использования, я бы нашел
Use(Func<IContext> func);
... который я могу использовать как:
For<IUserService>().Use(s =>
new AspNetMembershipProviderWrapper(Membership.Provider));