Ограничить доступ к объекту из другого проекта
Есть 3 проекта: A -> B, C (-> - A имеет ссылку на проект B)
В проекте B находятся основные классы, методы и т.д., в т.ч. DTO классы, которые используются в основном для сериализации и десериализации. Проекту A эти классы видеть не нужно, поэтому у всех них стоит модификатор internal. Данные между проектом B и C передаются в формате json, а значит, их необходимо десериализовать после передачи. Из-за этого приходится создавать абсолютно одинаковые классы и в проекте B, и в проекте C, и назначать им модификатор internal.
Суть проблемы: Можно ли с помощью каких-нибудь атрибутов или механизмов ограничить видимость к этим классам из проекта A, но предоставить из проекта C, оставив реализацию этих классов только в проекте B?
Пример такого класса. Абсолютно такой же есть на проекте B и C:
internal class SessionDto
{
public Guid OrderId { get; set; }
public List<OrderDto> Orders { get; set; }
public int Version { get; set; }
public SessionDto() { }
public SessionDto(Guid orderId, List<OrderDto> orders, int version)
{
OrderId = orderId;
Orders = orders;
Version = version;
}
}
Ответы (1 шт):
Думаю, стоит всё же ответить на вопрос, если кто-нибудь в дальнейшем столкнётся с данной проблемой.
Проблема звучит следующим образом - как ограничить доступ к объектам одного проекта, не дублируя их в других, применив модификатор доступа internal.
Ниже будут описаны действия, которые нужно выполнить:
Создаём дополнительный проект
Shared.dll.Добавляем ссылку на этот проект любому другому, которому необходимы internal-объекты.
Создаём в проекте
Shared.dllпапкуProperties, а в ней классAssemblyInfo.cs(его создать можно через меню "Добавить").Добавляем следующие строки в этот файл:
[assembly: InternalsVisibleTo("T")]
где T - Название проекта. Visual Studio сама подскажет, какие названия можно туда ставить.
- Создаём какие-либо объекты в проекте
Shared.dllи добавляем им модификатор доступаinternal.
Таким образом, в указанных проектах (в файле AssemblyInfo) будут видны internal объекты, описанные в Shared.dll.
Пример взаимодействия:
internal class Shared.SomeClass //объект в проекте Shared.dll
{
public Guid Id { get; set; }
}
Добавляем в проект B ссылку на Shared.dll. Взаимодействие будет выглядеть следующим образом: Shared.SomeClass....
Добавляем в проект A ссылку на B. Взаимодействие будет выглядеть следующим образом: Shared.SomeClass... - VisualStudio покажет ошибку, т.к. не видит данный класс.
Тем не менее, создав в проекте Shared.dll какой-либо публичный объект:
public class Shared.SomeClass2 //объект в проекте Shared.dll
{
public Guid Id { get; set; }
}
И выполнив те же действия - Shared.SomeClass2... - VisualStudio ничего против не скажет.
Надеюсь, помог кому-нибудь в будущем.
Спасибо Mark Shevchenko и Pavlo Khyzhniak.
Полезные ссылки: