Ответ Чилла совершенно правильный; Я хотел просто добавить немного цвета из недавнего чтения источника glibc ([master 8b0ccb2], в 2.17). Для ясности, если библиотека не найдена в месте, указанном данным уровнем, пробуется следующий уровень. Если библиотека найдена на заданном уровне, поиск прекращается.
Порядок поиска в динамической библиотеке:
Зависит от того, если у вас будет только один тип пуль ...
Если только один, то я бы сказал, что с вами все будет в порядке.
Но если у вас есть ] Bullet, DoubleBullet, PowerBullet, NukeBullet и т. Д.
Затем я бы создал базовый класс Bullet и все остальные производные от него
Затем я бы создал фабрику Bullet, и в ней были бы CreateBullet, CreatePowerBullet и т. Д.
Другой вопрос: будет ли что-нибудь еще делать пулю? Если так, то я бы создал фабрику, чтобы объединить логику создания в одном месте ...
В противном случае это пахнет, как будто вы используете DI просто для использования DI ...
Вы в значительной степени поняли. Если вы хотите отделиться от класса Bullet
, то, на мой взгляд, лучшим решением будет внедрение фабрики, которая может создавать объекты Bullet
.
Обратите внимание, что у вас есть несколько уровней косвенного обращения, каждое из которых дает вам большую гибкость, но требует больше кода и, возможно, труднее для понимания. Самый простой - иметь конкретные типы BulletFactory
и Bullet
. Это означает, что вы не можете легко иметь разные их реализации, но вы все равно можете расширить их и передать в подкласс BulletFactory
, который возвращает подклассы Bullet
. Если ваша единственная цель инъекции - упростить модульные тесты, я бы пошел по этому пути. Конечно, вы также можете сделать BulletFactory
интерфейсом или Bullet
интерфейсом, либо и то, и другое. Если вы собираетесь использовать разные устройства для целей, не связанных с тестированием, я бы выбрал именно этот путь.
Наконец, вы должны решить, будут ли преимущества отделения класса Bullet
от вашего PlayerShip
класса того стоит. Тесная связь - не зло, и ее не следует избегать любой ценой - в одних контекстах это имеет смысл, а в других нет. Только опыт поможет понять, когда объединять классы, а когда разделять.
Bullet
от вашего класса PlayerShip
. Тесная связь - не зло, и ее не следует избегать любой ценой - в одних контекстах это имеет смысл, а в других нет. Только опыт поможет понять, когда объединять классы, а когда разделять. вы должны решить, оправданы ли преимущества отделения класса Bullet
от вашего класса PlayerShip
. Тесная связь - не зло, и ее не следует избегать любой ценой - в одних контекстах это имеет смысл, а в других нет. Только опыт поможет понять, когда объединять классы, а когда разделять. Внедрение зависимости не подходит для этого случая. Если вы создадите для этого фабрику, вы будете чрезмерно использовать шаблоны проектирования. Вы не можете разделить всю систему, в этом случае Корабль имеет композицию с Пулей, и в случае, если вам нужно что-то более сложное, чем этот, другой шаблон (не обязательно DI) может быть адекватным.
Да, это пахнет чрезмерной архитектурой. Тем не менее, из моей головы, у вас может быть свойство, которое хранит тип маркера, а затем ваша структура DI (здесь ninject) создаст пулю.
public Type BulletType {get; set;}
public void fire()
{
var b = (BulletType) kernel.get(BulletType);
b.fire(point, direction);
}