访问课程

时间:2011-09-03 19:05:54

标签: c# linq-to-sql namespaces

我不知道在哪里/如何搜索这个问题所以我认为要求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允许访问项目中的所有命名空间。

2 个答案:

答案 0 :(得分:1)

只需将model属性更改为内部属性,以及DataModelDataContext类(可能通过在设计器中或手动编辑DBML来完成)。 Connection类可以了解内部类 - 它不能公开地公开它们。

作为一些旁白:

  • 如果model setter永远不会起作用,为什么要这样呢?摆脱它。
  • 您应该开始关注.NET naming conventions

答案 1 :(得分:1)

您将public DataModelDataContext model更改为

internal DataModelDataContext model

如果您希望它“在该程序集中是公共的,但对所有其他程序集是私有的”

protected DataModelDataContext model

private DataModelDataContext model

如果您不想将DataModelDataContext公开给该程序集中的其他类。

您最有可能将其视为internal

您可以搜索(或直接在MSDN上阅读)的术语是Access Modifiers