Ошибка StructureMap: для PluginFamily не определен экземпляр по умолчанию - PullRequest
6 голосов
/ 30 сентября 2011

очень новый для Structure-Map.пытаясь понять, как это работает и как я могу извлечь из этого выгоду.

я до сих пор получил это ..

Global.asax.cs:

IContainer container = new Container(x =>
    {
         x.For<IControllerActivator>().Use
              <StructureMapControllerActivator>();
         x.For<IUserRepo>().Use<UserRepo>();
    }); 

DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));

StructureMapControllerActivator:

public class StructureMapControllerActivator : IControllerActivator
{
    private readonly IContainer _container;

    public StructureMapControllerActivator(IContainer container )
    {
        this._container = container;
    }

    public IController Create(RequestContext requestContext, Type controllerType)
    {
        return _container.GetInstance(controllerType) as IController;
    }
}

StructreMapDependencyResolver:

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>();
    }
}

Мой аккаунтКонтроллер:

public class AccountController : Controller
{
    private readonly IUserRepo _userRepo;

    private AccountController()
    {
        _userRepo = ObjectFactory.GetInstance<IUserRepo>();
    }

    public ActionResult Login()
    {
        return View();
    }
}

Код и описание ошибки:

Код исключения StructureMap: 202 Не определен экземпляр по умолчанию для PluginFamily MBP_Blog.Controllers.AccountController MBP-Blog, версия= 1.0.0.0, Культура = нейтральная, PublicKeyToken = null

У меня есть имя интерфейса: IUserRepo и имя хранилища: UserRepo

, пожалуйста, помогите, когда я пытаюсь Google, но я не могу найтилюбое решение в течение первых 3 страниц.

Новая ошибка после использования кода @ Мартина:

Код исключения StructureMap: 180 StructureMap не может создавать объекты класса MBP_Blog.Controllers.AccountController, MBP-Blog, Версия = 1.0.0.0, Культура = Нейтral, PublicKeyToken = null, потому что не найден публичный конструктор.

1 Ответ

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

Убери StructureMapControllerActivator, я не думаю, что тебе это нужно.Если вы сохраните его, вам нужно добавить сопоставление для вашего AccountController.

. Кроме того, вместо этого используйте Controller Injection, это упростит юнит-тестирование:

public class AccountController : Controller
{
    private readonly IUserRepo _userRepo;

    public AccountController(IUserRepo userRepo)
    {
        _userRepo = userRepo;
    }

    public ActionResult Login()
    {
        return View();
    }
}

Также снова, дляваш контейнер, вы можете по умолчанию сопоставления.Это автоматически сопоставит IService с Service:

IContainer container = new Container(
            x =>
                {
                    x.Scan(scan =>
                               {
                                   scan.Assembly("MBP_Blog");
                                   scan.Assembly("MBP_Blog.Data");
                                   scan.WithDefaultConventions();
                               });
                });
...