我不知道在哪里/如何搜索这个问题所以我认为要求stackoverflow的comminuty是最好的选择。
基本上我正在设计一个项目,它只是提供一个逻辑项目访问LINQ to SQL模型以在数据库上执行CRUD。所以在Data项目中我有LINQ to SQL模型类和一个C#类来提供对模型的访问,如下所示
public class Connection : IDisposable
{
private DataModelDataContext _model;
public DataModelDataContext model
{
get { return _model; }
set { throw new Exception("Object \"model\" is not allowed to be created outside of its container class", new NotSupportedException()); }
}
public Connection(string username, string password)
{
User u = _model.Users.Where(u => u.Username == username && u.password == u.Password);
if (u == null)
throw new ApplicationException("User credentials are invalid", new AuthenticationException());
_model = new DataModelDataContext();
}
public void refreshAndKeepChanges(object entity)
{
_model.Refresh(RefreshMode.OverwriteCurrentValues, entity);
}
public int getChangesCount()
{
return _model.GetChangeSet().Deletes.Count() + _model.GetChangeSet().Inserts.Count() + _model.GetChangeSet().Updates.Count();
}
public void Dispose()
{
_model.SubmitChanges();
_model.Dispose();
}
}
我想要的是,当我编译DLL时,Logic项目可以访问Connection类(上面)而不是DataModelDataContext(因为这会破坏传递用户凭据的对象)。
我的问题是如何公开Connection类(作为我已经完成的公共)但是从DLL隐藏LINQ to SQL数据模型但允许Connection类访问它???
使用LINQ to SQL模型的额外命名空间不起作用,我发现添加DLL允许访问项目中的所有命名空间。
答案 0 :(得分:1)
只需将model
属性更改为内部属性,以及DataModelDataContext
类(可能通过在设计器中或手动编辑DBML来完成)。 Connection
类可以了解内部类 - 它不能公开地公开它们。
作为一些旁白:
model
setter永远不会起作用,为什么要这样呢?摆脱它。答案 1 :(得分:1)
您将public DataModelDataContext model
更改为
internal DataModelDataContext model
如果您希望它“在该程序集中是公共的,但对所有其他程序集是私有的”
protected DataModelDataContext model
或
private DataModelDataContext model
如果您不想将DataModelDataContext
公开给该程序集中的其他类。
您最有可能将其视为internal
。
您可以搜索(或直接在MSDN上阅读)的术语是Access Modifiers。