это нормально использовать StructureMap, как это? asp.net MVC 3 - PullRequest
1 голос
/ 30 сентября 2011

У меня есть сомнения, что я не использую лучшие практики для использования Structure-Map.

все работает нормально, но это просто путаница.

мой код выглядит следующим образом.

global.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 && !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 Ответ

1 голос
/ 30 сентября 2011

Нет. Как я уже говорил в вашем другом вопросе, выньте Активатор контроллера ... если вы не используете его для какой-либо цели (а это не похоже на вас).

Кроме того, эта строка является НЕПРАВИЛЬНОЙ:

x.ForRequestedType<AccountController>().TheDefault.Is.
              ConstructedBy(() => new AccountController(new UserRepo()));

Вы не должны использовать new для своего UserRepo ... это то, о чем заботится строка выше:

x.For<IUserRepo>().Use<UserRepo>();

Если вы возьмете ControllerActivator, у вас должно получиться хорошее начало для приложения MVC.

...