#asp.net-mvc #asp.net-mvc-3 #structuremap
#asp.net-mvc #asp.net-mvc-3 #structuremap
Вопрос:
я сомневаюсь, что я не использую наилучшую практику для использования Structure-Map.
все работает нормально, но просто путаница в голове.
мой код выглядит так.
глобальный.asax
IContainer container = new Container(
x => {
x.For<IUserRepo>().Use<UserRepo>();
x.For<IPostRepo>().Use<PostRepo>(); // this is the soultion for the error
});
DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));
PostController
private readonly IPostRepo _postRepo;
public PostController(IPostRepo postRepo)
{
this._postRepo = postRepo;
}
StructureMapDependencyResolver
public class StructureMapDependencyResolver : IDependencyResolver
{
private readonly IContainer _container;
public StructureMapDependencyResolver(IContainer container )
{
this._container = container;
}
public object GetService(Type serviceType)
{
object instance = _container.TryGetInstance(serviceType);
if(instance == null amp;amp; !serviceType.IsAbstract)
{
_container.Configure(c => c.AddType(serviceType,serviceType));
instance = _container.TryGetInstance(serviceType);
}
return instance;
}
public IEnumerable<object> GetServices(Type serviceType)
{
return _container.GetAllInstances(serviceType).Cast<object>();
}
}
вот IPostRepo выглядит так
public interface IPostRepo
{
bool CreatePost(Post newPost);
List<Post> ShowAllPosts();
Post FindPostById(int postId);
Post EditPost(Post editPost);
UserPostCommentViewModel FindAllPostComments(int postId);
int? AddPlusOneToNumberOfViews(int postId);
}
спасибо Мартин за вашу помощь
Ответ №1:
Нет. Как я уже говорил в вашем другом вопросе, извлеките активатор контроллера… если только вы не используете его для какой-то цели (на которую, похоже, вы не похожи).
Кроме того, эта строка явно НЕВЕРНА:
x.ForRequestedType<AccountController>().TheDefault.Is.
ConstructedBy(() => new AccountController(new UserRepo()));
Вы не должны использовать new
для своего UserRepo
… это то, о чем заботится строка выше:
x.For<IUserRepo>().Use<UserRepo>();
Если вы удалите ControllerActivator, у вас должно быть хорошее начало работы с приложением MVC.
Комментарии:
1. хорошо .. все отлично работает … когда я пытаюсь перейти к Postcontroller .. это выдает мне ошибку, подобную этой .. для PluginFamily MBP_Blog не определен экземпляр по умолчанию. Интерфейсы. IPostRepo
2. упс!! я не говорю Structure-Map, что использовать, когда вы получаете IPostRepo .. все работает как сливки …. спасибо Мартин…