Как я могу скрыть "сеттеры" от всех, кроме одной сборки? - PullRequest
2 голосов
/ 07 октября 2010

Я упоминал об этой проблеме в моем другом вопросе , но я думаю, что стоит разбить его на свой собственный вопрос, поскольку он на самом деле не зависит от других сценариев, которые я упомянул.

В любом случае - на Q, не знаю, возможно ли это.В поисках решения / обходного пути.

У меня есть библиотека классов, только с POCO:

MyCompany.MyProject.Domain.POCO

Эта сборка имеет POCO, подобную этой:

public class Post
{
   public int PostId { get; set; }
   public int Name { get; set; }
      ...
}

Теперь у меня есть другая библиотека классов, которая является моим DAL / Repository и использует Entity Framework 4.0 для персистентности:

MyCompany.MyProject.Repositories

Эта сборка имеет ссылку на проект POCO, так как она должна выполнять CRUDоперации над POCO (захват объектов БД, проецирование в POCO, возврат, а также изменение POCO).

Теперь у меня также есть веб-приложение , которое имеет ссылку как наСборка POCO и репозитория.

Если я сделаю это:

somePOCO.PostId = 10;

, я получу SQLException, так как PostId является полем IDENTITY в базе данных, и, следовательно, не долженбыть установленным.

Есть ли способ, которым я могу скрыть установщик для этих специальных свойств, чтобы только репозиторий имел доступ к установщику?

Я могу 'не могу придумать способ сделать это с помощью обычных модификаторов доступности(поскольку ни один из них не устраивает сценарий), вы, ребята, можете придумать обходной путь?

Ответы [ 3 ]

6 голосов
/ 07 октября 2010

вы можете сделать установщик внутренним и сделать внутренние компоненты видимыми для сборки репозитория

[assembly: InternalsVisibleTo("MyLibrary.Repositories")]
public class Post
{
   public int PostId { get; internal set; }
   public int Name { get; internal set; }
      ...
}

Это означает, что все могут «получить» эти свойства, но только эта сборка и сборка, содержащая репозиторий, можно «установить»

2 голосов
/ 07 октября 2010

Хороший ответ Люка Шефера . Это удовлетворяет техническому требованию вопроса. Но я бы посоветовал осторожность просто потому, что это может не решить проблему в будущем.

Не для того, чтобы предлагать более инженерное решение, но, возможно, вам стоит подумать о том, чтобы абстрагироваться дальше от того, что вы делаете с этими объектами, которые имеют устанавливаемое свойство ID. Может быть достаточно создать эту «видимость» с этим украшением атрибута, но я думаю, что это своего рода решение проблемы. Возможно, было бы чётче инкапсулировать взаимодействие между этими объектами с чем-то другим, что исключает доступ установщика из потребляющего кода.

2 голосов
/ 07 октября 2010

Отметьте все ваши сеттеры как внутренние, затем добавьте атрибут InternalsVisibleTo к вашей сборке POCO:

 [assembly: InternalsVisibleTo( "MyCompany.MyProject.Repositories" )]  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...