можно ли использовать StructureMap таким образом? asp.net MVC 3

#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 .. все работает как сливки …. спасибо Мартин…